exchange server - mac - Guarda el correo en el archivo msg usando la API de EWS
guardar correo como archivo (8)
Así es como resolví el problema para descargar de EWS el mensaje de correo electrónico en formato .eml a través del código vbs
'' This is the function that retrieves the message:
function CreaMailMsg(ItemId,ChangeKey)
Dim MailMsg
Dim GetItemSOAP,GetItemResponse,Content
LogFile.WriteLine (Now() & "-" & ":CreaMailMsg:ID:" & ItemId)
GetItemSOAP=ReadTemplate("GetItemMsg.xml")
GetItemSOAP=Replace(GetItemSOAP, "<!--ITEMID-->", ItemId)
GetItemSOAP=Replace(GetItemSOAP, "<!--ITEMCHANGEKEY-->", ChangeKey)
LogFile.WriteLine (Now() & ":GetItemSOAP:" & GetItemSOAP)
set GetItemResponse=SendSOAP(GetItemSOAP,TARGETURL,"",USERNAME,PASSWORD)
'' Check we got a Success response
if not IsResponseSuccess(GetItemResponse, "m:GetItemResponseMessage","ResponseClass") then
LogFile.WriteLine (Now() & "-" & ":ERRORE:Fallita GetItemMsg:" & GetItemResponse.xml)
Chiusura 1
end if
'' LogFile.WriteLine (Now() & "-" & ":DEBUG:riuscita GetItemMsg:" & GetItemResponse.xml)
Content = GetItemResponse.documentElement.getElementsByTagName("t:MimeContent").Item(0).Text
'' LogFile.WriteLine (Now() & ":Contenuto MIME" & Content)
CreaMailMsg = WriteAttach2File(Content,"OriginaryMsg.eml")
'' MailMsg.close
CreaMailMsg = true
end function
''###########################################################################
'' These are the functions the save the message in .eml format
''###########################################################################
function WriteAttach2File(Content,nomeAttach)
Dim oNode,oXML,Base64Decode
'' Read the contents Base64 encoded and Write a file
set oXML=CreateObject("MSXML2.DOMDocument")
set oNode=oXML.CreateElement("base64")
oNode.DataType="bin.base64"
oNode.Text = Content
Base64Decode = Stream_Binary2String(oNode.nodeTypedValue,nomeAttach)
Set oNode = Nothing
Set oXML = Nothing
end function
''###########################################################################
function Stream_Binary2String(binary,nomeAttach)
Const adTypeText = 2
Const adTypeBinary = 1
Dim BinaryStream
Set BinaryStream=CreateObject("ADODB.Stream")
BinaryStream.Type=adTypeBinary'' Binary
BinaryStream.Open
BinaryStream.Write binary
BinaryStream.Position=0
BinaryStream.Type=adTypeText
BinaryStream.CharSet = "us-ascii"
Stream_Binary2String=BinaryStream.ReadText
''msgbox Stream_Binary2String
BinaryStream.SaveToFile ShareName & "/" & nomeAttach,2
Set BinaryStream=Nothing
end function
Estoy usando la API administrada 1.1 de los servicios web de Exchange para conectarme al servidor de Exchange 2010 y luego descubrir los nuevos correos electrónicos recibidos. Ahora quiero guardar una copia del archivo .msg en una carpeta en el disco.
No quiero utilizar ningún tercero pagado para integrarme.
Cualquier ayuda será apreciada.
Esta sugerencia fue publicada como un comentario por @mack, pero creo que merece su propio lugar como respuesta, aunque solo sea por el formato y la legibilidad de las respuestas frente a los comentarios.
using (FileStream fileStream =
File.Open(@"C:/message.eml", FileMode.Create, FileAccess.Write))
{
message.Load(new PropertySet(ItemSchema.MimeContent));
MimeContent mc = message.MimeContent;
fileStream.Write(mc.Content, 0, mc.Content.Length);
}
No hay soporte nativo para archivos MSG usando EWS. Es estrictamente un formato de Outlook.
La especificación de MSG se publica en http://msdn.microsoft.com/en-us/library/cc463912%28EXCHG.80%29.aspx . Es un poco complicado de entender, pero factible. Necesitará desplegar todas las propiedades del mensaje y luego serializarlo en un formato de archivo estructurado OLE. No es una tarea fácil.
Al final, es probable que sea mejor ir con una biblioteca de terceros, de lo contrario, podría ser una gran tarea.
Puede acceder fácilmente a los contenidos MIME del mensaje a través de message.MimeContent y guardar el mensaje como un archivo EML. Las últimas versiones de Outlook (2013 y 2016) podrán abrir archivos EML directamente.
message.Load(new PropertySet(ItemSchema.MimeContent));
MimeContent mimcon = message.MimeContent;
FileStream fStream = new FileStream("c:/test.eml", FileMode.Create);
fStream.Write(mimcon.Content, 0, mimcon.Content.Length);
fStream.Close();
Si aún necesita convertir al formato MSG, tiene algunas opciones:
1) El formato de archivo MSG está documentado, es un archivo de almacenamiento OLE (IStorage). Consulte https://msdn.microsoft.com/en-us/library/cc463912(v=exchg.80).aspx
2) Utilice un contenedor de archivos MSG de terceros, como el de Independentsoft: http://www.independentsoft.de/msg/index.html . Establecer todas las propiedades que Outlook espera puede ser un desafío.
3) Convierta el archivo EML a MSG directamente usando Redemption :
set Session = CreateObject("Redemption.RDOSession")
set Msg = Session.CreateMessageFromMsgFile("c:/test.msg")
Msg.Import("c:/test.eml", 1024)
Msg.Save
Puede descargar todos los archivos adjuntos utilizando EWS API y C #. A continuación se muestra el ejemplo:
byte[][] btAttachments = new byte[3][]; //To store 3 attachment
if (item.HasAttachments) {
EmailMessage message = EmailMessage.Bind(objService, new ItemId(item.Id.UniqueId.ToString()), new PropertySet(BasePropertySet.IdOnly, ItemSchema.Attachments));
noOfAttachment = message.Attachments.Count;
// Iterate through the attachments collection and load each attachment.
foreach(Attachment attachment in message.Attachments)
{
if (attachment is FileAttachment)
{
FileAttachment fileAttachment = attachment as FileAttachment;
// Load the file attachment into memory and print out its file name.
fileAttachment.Load();
//Get the Attachment as bytes
if (i < 3) {
btAttachments[i] = fileAttachment.Content;
i++;
}
}
// Attachment is an item attachment.
else
{
// Load attachment into memory and write out the subject.
ItemAttachment itemAttachment = attachment as ItemAttachment;
itemAttachment.Load(new PropertySet(EmailMessageSchema.MimeContent));
MimeContent mc = itemAttachment.Item.MimeContent;
if (i < 3) {
btAttachments[i] = mc.Content;
i++;
}
}
}
}
El código anterior convierte todos los archivos adjuntos en bytes. Una vez que tenga bytes, puede convertir bytes en el formato requerido. Para convertir bytes en archivos y guardar en el disco, siga los enlaces a continuación: Escriba bytes en el archivo http://www.digitalcoding.com/Code-Snippets/C-Sharp/C-Code-Snippet-Save-byte-array-to-file.html
Si el formato eml es una opción y php es el idioma, use base64_decode en Mimencontent antes de guardar en el archivo.
Si utiliza https://github.com/Heartspring/Exchange-Web-Services-for-PHP o https://github.com/hatsuseno/Exchange-Web-Services-for-PHP debe agregar
$newmessage->mc = $messageobj->MimeContent->_;
En la línea 245 o 247.
Si va de EntryID de Outlook a través de VSTO (Hex) a EwsID, debe consultar aquí: http://bernhardelbl.wordpress.com/2013/04/15/converting-entryid-to-ewsid-using-exchange-web-services-ews/
Me salvó. Seguí recibiendo un "Datos corruptos". mensaje.
Si está dispuesto a guardar en el formato .eml
, puede hacerlo fácilmente usando solo EWS y no bibliotecas de terceros. El archivo .eml
contendrá la misma información y Outlook puede abrirlo de la misma forma que .msg (y también por otros programas).
message.Load(new PropertySet(ItemSchema.MimeContent));
MimeContent mc = message.MimeContent;
FileStream fs = new FileStream("c:/test.eml", FileMode.Create);
fs.Write(mc.Content, 0, mc.Content.Length);
fs.Close();
Código limpiado:
message.Load(new PropertySet(ItemSchema.MimeContent));
var mimeContent = message.MimeContent;
using (var fileStream = new FileStream(@"C:/Test.eml", FileMode.Create))
{
fileStream.Write(mimeContent.Content, 0, mimeContent.Content.Length);
}