2011-06-09 42 views
24

Estoy utilizando la API administrada de servicios web de Exchange 1.1 para conectarme al servidor 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.Guardar el correo en el archivo msg utilizando la API EWS

No quiero utilizar ningún tercero pagado para integrar.

Cualquier ayuda será apreciada.

+0

hicieron que ha intentado guardar en *** *** o *** eml msg *** presentar..? – Kiquenet

Respuesta

6

No hay soporte nativo para archivos MSG usando EWS. Es estrictamente un formato de Outlook.

La especificación MSG se publica en http://msdn.microsoft.com/en-us/library/cc463912%28EXCHG.80%29.aspx. Es un poco complicado de entender, pero puede hacerlo. Debería 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 mejor que vayas con una biblioteca de terceros, de lo contrario, podría ser una gran tarea.

47

En cambio, si está contento de guardar en el formato .eml, puede hacerlo muy fácilmente simplemente usando EWS y sin bibliotecas de terceros. El archivo .eml contendrá la misma información y Outlook lo puede abrir de la misma manera que .msg (y también para 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(); 

Se ha limpiado código:

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

Sé que esto ya pasó, pero gracias por su respuesta. Me ahorro mucho tiempo. – Fox

+3

De acuerdo. ¡Esto fue muy útil! Lo cambié un poco para usar una instrucción de uso: usando (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); } – mack

+0

Limpié el código incluyendo las declaraciones 'using' y también corregí un error con el literal de la cadena (' @ "C: \ Test.eml" '). –

0

Puede descargar todos los archivos adjuntos que utilizan la API de EWS y C#. A continuación se muestra el ejemplo dado:

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

}

Por encima de código convierte todo el accesorio en bytes. Una vez que tenga bytes, puede convertir bytes en su formato requerido. para convertir bytes en archivos y guardar en el disco siga los siguientes enlaces: Write bytes to file http://www.digitalcoding.com/Code-Snippets/C-Sharp/C-Code-Snippet-Save-byte-array-to-file.html

2

Esta sugerencia fue publicada como un comentario de @mack, pero creo que merece su propio lugar como una respuesta, si no por otra razón que 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); 
} 
0

Esto es cómo he resuelto el problema de descarga de EWS el mensaje de correo electrónico en formato .eml a través de 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 
1

Puede acceder fácilmente al contenido MIME del mensaje a través de message.MimeContent y guardar el mensaje como un archivo EML. Las versiones más recientes (2013 y 2016) de Outlook 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 para convertir al formato MSG, usted tiene algunas opciones:

1) formato de archivo MSG se documenta - es un archivo de almacén de OLE (IStorage). Ver https://msdn.microsoft.com/en-us/library/cc463912(v=exchg.80).aspx

2) Use 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) convierte un archivo EML a MSG usando directamente Redemption:

set Session = CreateObject("Redemption.RDOSession") 
set Msg = Session.CreateMessageFromMsgFile("c:\test.msg") 
Msg.Import("c:\test.eml", 1024) 
Msg.Save 
+0

Guardar en *** eml *** es fácil, pero guardar en ***. Msg *** requiere ** de terceros ** (_NOT free_) – Kiquenet

+0

Todavía puede trabajar directamente con el archivo MSG en el nivel binario , pero la pregunta es si hacerlo le ahorrará tiempo o dinero, probablemente no. –

Cuestiones relacionadas