В настоящее время я работаю над отправкой зарезервированной почтовой системы с помощью Graph SDK.
Я пытаюсь отправить сохраненный файл .eml (Mimecontent) с помощью Graph sdk (v5).
Я нашел способ на https://learn.microsoft.com/en-us/graph/api/user-sendmail?view=graph-rest-1.0&tabs=http, но он показывает путь только для http.
Поэтому я использую библиотеку MIMEKIT, восстанавливаю электронное письмо и отправляю его, но не думаю, что это лучший способ сделать это.
byte[] newbuffer = File.ReadAllBytes(filepath);
using (var memoryStream = new MemoryStream(newbuffer)) {
var mimeMessage = MimeKit.MimeMessage.Load(memoryStream);
var message = new Microsoft.Graph.Models.Message
{
Subject = mimeMessage.Subject,
Body = new Microsoft.Graph.Models.ItemBody
{
ContentType = mimeMessage.HtmlBody != null ? Microsoft.Graph.Models.BodyType.Html : Microsoft.Graph.Models.BodyType.Text,
Content = mimeMessage.HtmlBody ?? mimeMessage.TextBody
},
ToRecipients = mimeMessage.To.Mailboxes.Select(mailbox => new Microsoft.Graph.Models.Recipient
{
EmailAddress = new Microsoft.Graph.Models.EmailAddress { Address = mailbox.Address }
}).ToList()
};
var draftMessage = await gsc.Users[userinfo.UserPrincipalName].Messages.PostAsync(message);
foreach (var attachment in mimeMessage.Attachments.OfType<MimeKit.MimePart>())
{
var attachmentStream = new MemoryStream();
attachment.Content.DecodeTo(attachmentStream);
byte[] fileBytes = attachmentStream.ToArray();
attachmentStream.Dispose();
var fileAttachment = new Microsoft.Graph.Models.FileAttachment
{
OdataType = "#microsoft.graph.fileAttachment",
ContentBytes = fileBytes,
ContentType = attachment.ContentType.MimeType,
Name = attachment.FileName
};
await gsc.Users[userinfo.UserPrincipalName].Messages[draftMessage.Id].Attachments.PostAsync(fileAttachment);
}
await gsc.Users[userinfo.UserPrincipalName].Messages[draftMessage.Id].Send.PostAsync();
}
Мне интересно, могу ли я использовать ToPostRequestInformation для более простого способа? Или кто-нибудь знает другой способ? пожалуйста, помогите мне
Я бы использовал ToPostRequestInformation
для создания информации о запросе, а затем установил Content
, который должен быть потоком из файла .eml.
RequestInformation ri = gsc.Users[userinfo.UserPrincipalName].SendMail.ToPostRequestInformation(new SendMailPostRequestBody());
// set header
ri.Headers.Remove("Content-Type");
ri.Headers.Add("Content-Type", "text/plain");
// set input stream, content
ri.Content = new MemoryStream(newbuffer);
// get request adapter
var requestAdapter = graphClient.RequestAdapter;
var errorMapping = new Dictionary<string, ParsableFactory<IParsable>> {
{"XXX", ODataError.CreateFromDiscriminatorValue},
};
// send request
await requestAdapter.SendNoContentAsync(ri, errorMapping);
@JohnPark Я обновил код, добавив отображение ошибок, но он не разрешит 400 неверных запросов. Я попробую больше файлов .eml, чтобы воспроизвести проблему.
хм, я получаю сообщение об ошибке при ожидании requestAdapter.SendNoContentAsync(ri); Microsoft.Kiota.Abstractions.ApiException: сервер вернул неожиданный код состояния, и для этого кода не зарегистрирована фабрика ошибок: 400. Есть ли возможная причина этого?