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