Отправляйте электронные письма с большими вложениями с помощью библиотеки MS Graph

Недавно Microsoft объявила, что можно отправлять электронные письма с вложениями размером более 4 МБ. Согласно документации, мы должны создать черновик, затем сеанс загрузки, загрузить вложение и, наконец, отправить письмо.

Я могу создать черновик, используя приведенный ниже код:

var confidentialClientApplication = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithClientSecret(clientSecret)
    .WithTenantId(tenant)
    .Build();

var authenticationProvider = new ClientCredentialProvider(confidentialClientApplication);
var graphClient = new GraphServiceClient(authenticationProvider);

var email = new Message
{
    Body = new ItemBody
    {
      Content = i + " Works fine! " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
      ContentType = BodyType.Html,
    },
    Subject = "Test" + (j == 0 ? "" : " " + j),
    ToRecipients = recipientList,
    Attachments = att
};

Message draft = await graphClient
    .Users["[email protected]"]
    .Messages
    .Request()
    .AddAsync(mail);

но когда я пробую фрагмент из документов:

var attachmentItem = new AttachmentItem
{
    AttachmentType = AttachmentType.File,
    Name = "flower",
    Size = 3483322
};

await graphClient.Me.Messages["AAMkADI5MAAIT3drCAAA="].Attachments
    .CreateUploadSession(attachmentItem)
    .Request()
    .PostAsync();

Я получаю эти ошибки:

  1. Не удалось найти тип или имя пространства имен AttachmentItem (вам не хватает директивы using или ссылки на сборку?)
  2. Имя AttachmentType не существует в текущем контексте.
  3. 'IMessageAttachmentsCollectionRequestBuilder' не содержит определения для 'CreateUploadSession' и не может быть найден доступный метод расширения 'CreateUploadSession', принимающий первый аргумент типа 'IMessageAttachmentsCollectionRequestBuilder' (вам не хватает директивы using или ссылки на сборку?)

Я добавил ссылки как на стабильную, так и на бета-версию библиотек графов (Microsoft.Graph, Microsoft.Graph.Beta) (раньше я использовал конечную точку бета), но я не могу найти AttachmentItem.

Я искал два репозитория (https://github.com/microsoftgraph/msgraph-sdk-dotnet, https://github.com/microsoftgraph/msgraph-beta-sdk-dotnet) для AttachmentItem, но я ничего не нашел.

Отправка писем с большими вложениями - довольно новая функция (документы от 25 октября 2019 года), но, согласно документам, это должно поддерживаться.

Документы неверны? Как я могу создать сеанс загрузки и загрузить вложения? Должен ли я создавать запросы вручную? Или я могу использовать библиотеку Microsoft.Graph?

Я вижу только CreateUploadSession для Диска - https://github.com/microsoftgraph/msgraph-sdk-dotnet/search?q=CreateUploadSession&unscoped_q=CreateUploadSession


person Misiu    schedule 07.11.2019    source источник


Ответы (2)


Пришлось искать рабочее решение. Обратите внимание, что в этом примере используется nuget Microsoft.Graph.Auth, который на момент написания все еще находится в стадии предварительного просмотра, поэтому в дальнейшем он может быть изменен.

var tenant = "xxxxxxxxxxxxxxxxxx";
var client = "yyyyyyyyyyyyyyyyyy";
var secret = "xxxxxxxxxxxxxxxxxx";
var senderEmail = "[email protected]";

IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
    .Create(client)
    .WithTenantId(tenant)
    .WithClientSecret(secret)
    .Build();

ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);
GraphServiceClient graphClient = new GraphServiceClient(authProvider );

var fileName = "some_huge_file.pdf";
var path = System.IO.Path.Combine(@"D:\Path_To_Your_Files", fileName );
var message = new Message
{
    Subject = "Check out this Attachment?",
    Body = new ItemBody
    {
        ContentType = BodyType.Html,
        Content = "Its <b>awesome</b>!"
    },
    ToRecipients = new List<Recipient>()
    {
        new Recipient
        {
            EmailAddress = new EmailAddress
            {
                Address = "[email protected]"
            }
        }
    },
};

var attachmentContentSize = new System.IO.FileInfo(path).Length;

//check to make sure content is below 3mb limit
var isOver3mb = attachmentContentSize > (1024*1024*3);

//if below our limit, send directly.
if( isOver3mb == false )
{
    message.Attachments = new MessageAttachmentsCollectionPage()
    {
        new FileAttachment{ Name = fileName, ContentBytes = System.IO.File.ReadAllBytes(path) }     
    };
    
    await graphClient.Users[senderEmail].SendMail(message, true).Request().PostAsync();
}
else
{
    //first create an email draft
    var msgResult = await graphClient.Users[senderEmail].Messages
                            .Request()
                            .AddAsync(message);

    var attachmentItem = new AttachmentItem
    {
        AttachmentType = AttachmentType.File,
        Name = fileName,
        Size = attachmentContentSize,       
    };

    //initiate the upload session for large files (note that this example doesn't handle multiple attachment).
    var uploadSession = await graphClient.Users[senderEmail].Messages[msgResult.Id].Attachments
                                                            .CreateUploadSession(attachmentItem)
                                                            .Request()
                                                            .PostAsync();
     
    var maxChunkSize = 1024 * 320;      
    var allBytes = System.IO.File.ReadAllBytes(path);
        
    using( var stream =  new MemoryStream ( allBytes ) )
    {
        stream.Position = 0;
        LargeFileUploadTask<FileAttachment> largeFileUploadTask = new LargeFileUploadTask<FileAttachment>(uploadSession, stream, maxChunkSize);

        await largeFileUploadTask.UploadAsync();
    }
    //once uploaded, sends out the email from the Draft folder
    await graphClient.Users[senderEmail].Messages[msgResult.Id].Send().Request().PostAsync();
}
person KnaveT    schedule 30.03.2021

Эта функция находится в предварительной версии (также известной как бета). Поскольку эти API и ресурсы существуют только в бета-версии Graph, вы не можете использовать версию GA Microsoft .Graph. Вам необходимо использовать Microsoft.Graph.Beta версия библиотеки.

person Marc LaFleur    schedule 07.11.2019
comment
Раньше я использовал бета-версию, я добавил пакет в соответствии с github.com/microsoftgraph/ (с использованием псевдонима), но предварительная версия 0.8.0 выпущена 19 сентября, и похоже, что она не содержит этих методов и классов. Или я что-то напортачил. - person Misiu; 07.11.2019
comment
Бета-библиотека обновляется только периодически. Я подозреваю, что он обновится на следующей неделе после Ignite. Обычно во время конференции воздерживается от перестройки бета-версии, так как обычно развертывается несколько бета-API, и они в конечном итоге регенерируют ее несколько раз. - person Marc LaFleur; 07.11.2019
comment
Звучит разумно, чтобы не выпускать новую бета-версию во время Ignite :) Подожду немного, надеюсь, это будет добавлено. - person Misiu; 08.11.2019
comment
Есть какие-нибудь обновления об этом? Я ничего не вижу в бета-библиотеке. Я думал о том, чтобы делать запросы самостоятельно, но мне нужно заново реализовать логику повтора, аутентификацию и почти все, что предлагает библиотека. - person Misiu; 13.11.2019
comment
Вы можете использовать SDK для прямых вызовов конечной точки. См. [Отправка HTTP-запросов с помощью клиентской библиотеки .Net Microsoft Graph]) github.com/microsoftgraph/msgraph-sdk-dotnet/blob/dev/docs/) - person Marc LaFleur; 13.11.2019