Salva la posta nel file msg usando l’API EWS

Sto utilizzando l’API gestita dai servizi Web di Exchange 1.1 per connettersi al server Exchange 2010 e quindi trovare nuovi messaggi di posta elettronica ricevuti. Ora voglio salvare una copia del file .msg in una cartella sul disco.

Non voglio usare nessuna terza parte pagata per integrarmi.

Qualsiasi aiuto sarà apprezzato.

Se sei felice di salvare nel formato .eml , puoi farlo molto facilmente semplicemente usando EWS e nessuna libreria di terze parti. Il file .eml conterrà tutte le stesse informazioni e può essere aperto da Outlook allo stesso modo di .msg (e anche da altri programmi).

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

Codice pulito:

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

Non esiste un supporto nativo per i file MSG che utilizzano EWS. È rigorosamente un formato di Outlook.

Le specifiche MSG sono pubblicate all’indirizzo http://msdn.microsoft.com/en-us/library/cc463912%28EXCHG.80%29.aspx . È un po ‘complicato da capire, ma fattibile. Dovresti visualizzare tutte le proprietà del messaggio e serializzarlo in un formato di file strutturato OLE. Non è un compito facile.

Alla fine, probabilmente stai meglio con una libreria di terze parti altrimenti potrebbe essere un grande compito da realizzare.

Questo suggerimento è stato pubblicato come commento da @mack, ma penso che meriti il ​​proprio posto come risposta, se non altro per la formattazione e la leggibilità delle risposte rispetto ai commenti.

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

Se il formato eml è un’opzione e php è la lingua usa base64_decode sul Mimencontent prima di salvare su file.

Se è necessario aggiungere https://github.com/Heartspring/Exchange-Web-Services-for-PHP o https://github.com/hatsuseno/Exchange-Web-Services-for-PHP è necessario aggiungere

  $newmessage->mc = $messageobj->MimeContent->_; 

sulla linea 245 o 247.

È ansible accedere facilmente ai contenuti MIME del messaggio tramite message.MimeContent e salvare il messaggio come file EML. Le ultime versioni (2013 e 2016) di Outlook saranno in grado di aprire direttamente i file EML.

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

Se hai ancora bisogno di convertire in formato MSG, hai alcune opzioni:

1) Il formato del file MSG è documentato – si tratta di un file di archivio OLE (IStorage). Vedere https://msdn.microsoft.com/en-us/library/cc463912(v=exchg.80).aspx

2) Utilizzare un wrapper di file MSG di terze parti, come quello di Independentsoft: http://www.independentsoft.de/msg/index.html . Impostare tutte le proprietà che Outlook si aspetta può essere difficile.

3) Convertire il file EML in MSG direttamente usando Redemption :

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

Puoi scaricare tutti gli allegati usando EWS API e C #. Di seguito è riportato l’esempio:

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

}

Sopra il codice converte tutti gli allegati in byte. Una volta che hai i byte, puoi convertire i byte nel formato richiesto. Per convertire i byte in file e salvarli nel disco, segui i seguenti collegamenti: Scrivi byte nel file http://www.digitalcoding.com/Code-Snippets/C-Sharp/C-Code-Snippet-Save-byte-array-to -file.html

Ecco come ho risolto il problema di scaricare da EWS il messaggio di posta elettronica in formato .eml tramite codice 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) GetItemSOAP=Replace(GetItemSOAP, "", 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 

Se stai passando da EntryID di Outlook tramite VSTO (Hex) a EwsID, devi cercare qui: http://bernhardelbl.wordpress.com/2013/04/15/converting-entryid-to-ewsid-using-exchange-web -Servizi-ews /

Mi ha salvato. Ho continuato a ricevere “I dati sono corrotti”. Messaggio.