online mac guardar editar documento correo convertir con como archivos archivo abrir exchange-server ews-managed-api

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 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); }