Скачать .eml-файл с Microsoft Graph C#

#c# #graph #microsoft-graph-api #microsoft-graph-mail

#c# #График #microsoft-graph-api #microsoft-graph-mail

Вопрос:

У меня есть некоторые проблемы с Microsoft Graph.Я хотел бы загрузить вложения, присутствующие в определенном электронном письме. Я проверил, что тип объекта, возвращенный после этого:

  var attachments = graphClient.Me.Messages[msg.Id].Attachments.Request().GetAsync().Resu<
 foreach(var item in attachments) {
         var current_attachment = graphClient.Me.Messages[msg.Id].Attachments[item.Id].Request().GetAsync().Resu<
}
  

является объектом типа Attachment .
Теперь я хотел бы загрузить этот объект (current_attachment), но я увидел, что свойство ContentBytes недоступно.
Я попытался преобразовать объект в FileAttachment, но он выдает исключение.

Спасибо.

Ответ №1:

Это должно быть довольно просто. В частности:

https://learn.microsoft.com/en-us/graph/outlook-get-mime-message

Несмотря на то, что Outlook не сохраняет сообщения в формате MIME, есть два способа получить текст сообщения Outlook в формате MIME:

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

Затем вы можете сохранить содержимое тела сообщения в файле .EML и прикрепить файл к записям в бизнес-системах, например, для CRM, ERP и отслеживания ошибок.

Вот пример:

https://learn.microsoft.com/en-us/graph/api/message-get?view=graph-rest-1.0amp;tabs=csharp

Возвращает содержимое MIME сообщения в почтовом ящике пользователя, вошедшего в систему.

 GraphServiceClient graphClient = new GraphServiceClient( authProvider );

var stream = await graphClient.Me.Messages["4aade2547798441eab5188a7a2436bc1"].Content
  .Request()
  .GetAsync();
  

Вы можете записать «поток» в дисковый файл, подобный этому:

 string path = @"mypathmyfile.eml";
using(FileStream outputFileStream = new FileStream(path, FileMode.Create)) 
{  
    stream.CopyTo(outputFileStream);  
}  
  

Результирующий файл .eml будет представлять собой полное электронное письмо, включая все вложения.

Комментарии:

1. Я смог получить доступ к вложению, но я хотел бы загрузить его на локальный диск. Перед использованием Graph я использовал следующий код для загрузки вложений: если (вложение. GetType() == typeof(привязка файла)) { var item = (FileAttachment)вложение; // Приведено из вложения System.IO.File. Записать все байты (di.FullName «\» item.Name , предмет. ContentBytes); } но теперь тип вложения — ItemAttachment и, следовательно, не содержит свойства ContentBytes . Как я могу использовать System.IO.File. WriteAllBytes для записи байтов вложения с этим новым типом вложения?

2. В вашей теме письма был задан вопрос: «Вопрос: Как я могу загрузить файл .eml с помощью Microsoft Graph C #?» Приведенный мною код делает именно это: он предоставляет вам поток; вы можете записать поток в файл .eml. Файл будет представлять собой полное электронное письмо, включая все вложения.

Ответ №2:

Вы можете выполнить аналогичный вызов, чтобы получить входной поток для ItemAttachment, как вы бы сделали, чтобы получить входной поток для сообщения. Смотрите код ниже на Java, но он будет похож на c #. В java API отсутствует опция .content() для вложений, но вы можете создать URL-адрес и добавить вместо него значение $.

 URL requestUrl = graphClient.users("user@***.com").messages("*****").attachments("****").buildRequest().getRequestUrl();
InputStream is = new FileAttachmentStreamRequestBuilder(requestUrl.toString()   "/$value", graphClient, null).buildRequest().get();
// save the file
Files.copy(is, Paths.get(fileName   extension), StandardCopyOption.REPLACE_EXISTING);