Сохранить почту в msg-файле с помощью EWS API

Я использую управляемый API 1.1 для веб-служб Exchange для подключения к серверу Exchange 2010, а затем узнайте о полученных новых электронных сообщениях. Теперь я хочу сохранить копию файла .msg в папку на диске.

Я не хочу использовать какую-либо платную третью сторону для интеграции.

Любая помощь будет оценена.

8 Solutions collect form web for “Сохранить почту в msg-файле с помощью EWS API”

Если вы хотите сохранить в формате .eml , это можно сделать очень просто, используя EWS и сторонние библиотеки. Файл .eml будет содержать всю ту же информацию и может быть открыт Outlook таким же образом, как и .msg (а также другими программами).

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

Очищенный код:

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

Не существует встроенной поддержки файлов MSG с использованием EWS. Это строго формат Outlook.

Спецификация MSG публикуется по адресу http://msdn.microsoft.com/en-us/library/cc463912%28EXCHG.80%29.aspx . Это немного сложно понять, но сделать. Вам нужно будет снять все свойства сообщения, а затем сериализовать его в формате структурированного файла OLE. Это непростая задача.

В конце концов, вы, вероятно, лучше отправитесь в стороннюю библиотеку, иначе это может быть большой задачей.

Это предложение было опубликовано как комментарий от @mack, но я думаю, что он заслуживает своего места в качестве ответа, если только по какой-либо причине, кроме форматирования и удобочитаемости ответов или комментариев.

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

Если формат eml является опцией, а php – это использование base64_decode на Mimencontent перед сохранением файла.

Если вы используете https://github.com/Heartspring/Exchange-Web-Services-for-PHP или https://github.com/hatsuseno/Exchange-Web-Services-for-PHP, необходимо добавить

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

на линии 245 или 247.

Вы можете легко получить доступ к содержимому MIME сообщения через message.MimeContent и сохранить сообщение в виде файла EML. В последних версиях Outlook (2013 и 2016 гг.) Outlook можно напрямую открывать файлы 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(); 

Если вам все равно нужно преобразовать в формат MSG, у вас есть несколько вариантов:

1) Формат файла MSG документирован – это файл хранилища OLE (IStorage). См. https://msdn.microsoft.com/en-us/library/cc463912(v=exchg.80).aspx

2) Используйте стороннюю файловую оболочку MSG, например, файл Independentsoft: http://www.independentsoft.de/msg/index.html . Настройка всех свойств, ожидаемых Outlook, может быть сложной задачей.

3) Преобразование EML-файла в MSG напрямую с использованием Redemption :

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

Вы можете загрузить все вложения с помощью EWS API и C #. Ниже приведен пример:

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

}

Выше кода преобразует все вложения в байты. Когда у вас есть байты, вы можете преобразовать байты в требуемый формат. Для преобразования байтов в файлы и сохранения на диске следуйте приведенным ниже ссылкам: Напишите байты в файл http://www.digitalcoding.com/Code-Snippets/C-Sharp/C-Code-Snippet-Save-byte-array-to -file.html

Вот как я решил проблему для загрузки с EWS сообщения электронной почты в формате .eml через код 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 

Если вы переходите из EntryID Outlook через VSTO (Hex) в EwsID, вам нужно посмотреть здесь: http://bernhardelbl.wordpress.com/2013/04/15/converting-entryid-to-ewsid-using-exchange-web -services-овости /

Сохранял меня. Я продолжал получать «Данные повреждены». сообщение.

Interesting Posts

Широковещательный приемник для обнаружения запуска приложения

Подмножество объекта xts по времени суток

Могу ли я переопределить кнопку «Главная» в моем приложении?

Tkinter, превышена максимальная глубина рекурсии

Чистая реализация Java / JSF для двойного представления

неизвестная ошибка: результат функции вызова отсутствует «значение» для Selenium Send Keys даже после обновления хромированной передачи

Хороший способ инкапсуляции Integer.parseInt ()

IE: невозможно загрузить * из *. Не удалось открыть этот интернет-сайт. Запрошенный сайт либо недоступен, либо не может быть найден

Файл страницы Windows на нескольких жестких дисках

Единство взыскания – условное разрешение

Каков правильный способ кодирования URL-символов Unicode?

Как проверить события открытия лотка для CD / DVD в Windows 7?

Сравнение дат данных

Преимущества и недостатки ключей базы данных GUID / UUID

Что делает приложение терминалов «Показать альтернативный экран»? (OS X)

Давайте будем гением компьютера.