Microsoft Graph API邮件中附件的3 MB限制是否累积?

问题描述

我已经使用Microsoft Graph .NET客户端库发送邮件已有一段时间了,并且运行良好,但是今天我注意到了一个非常奇怪的问题。

到目前为止,这里是附件的基本规则...

  • 如果文件大小小于3 MB,请对附件执行一次POST Outlook项目的导航属性;看看如何做到这一点 消息或事件。成功的POST响应包含ID 文件附件。
  • 如果文件大小在3MB至150MB之间, 创建一个上传会话,并反复使用PUT上传范围 文件的字节数,直到您上传了整个文件。标头 在最终成功的PUT响应中,包含带有 附件ID。

https://docs.microsoft.com/en-us/graph/outlook-large-attachments?tabs=http

非常简单。如果附件少于3 MB,我将在消息中附带它。如果更多,那么我创建一个上传会话。

现在解决这个问题。如果有多个附件的总大小超过该限制,我将收到以下消息...

支持的最大请求长度为4MB。

解决此问题,在达到累积限制后,我开始为其余文件启动上传会话。但是,我随后收到以下错误消息...

消息:附件大小必须大于最小大小。

这是因为上传会话的大小最小。

快速回顾:当总数超过最大限制时,我无法上传多个小附件。我无法通过会话上传它们,因为它小于最小限制。有人注意到这个问题吗?

使用Microsoft Graph Client Library v3.6

解决方法

不确定这是否行得通。但是您可以尝试将电子邮件另存为模板,然后使用API​​将附件添加到模板中。然后发送模板。

限制似乎是对通话大小的限制,而不是电子邮件的大小。

,

以下代码适用于总计 > 4 Mb:

Message draft = await _GraphClient
                        .Users[UserPrincipalNameOrId]
                        .MailFolders
                        .Drafts
                        .Messages
                        .Request()
                        //.WithMaxRetry(5)
                        .AddAsync(emailToSend);

foreach (var attachment in Attachments)
{
    if (attachment.FullPath != null)
    {
        FileInfo f = new FileInfo(attachment.FullPath);
        if (f.Length < MINIMUM_SIZE_FOR_UPLOAD_SESSION) // 3 Mo
        {
            string mimeType = MimeTypes.MimeTypeMap.GetMimeType(f.Extension); 
            FileAttachment fileAttachment = new FileAttachment
            {
                ODataType = "#microsoft.graph.fileAttachment",ContentBytes = System.IO.File.ReadAllBytes(attachment.FullPath),ContentType = mimeType,ContentId = f.Name,Name = f.Name
            };
            await _GraphClient
                    .Users[UserPrincipalNameOrId]
                    .Messages[draft.Id]
                    .Attachments
                    .Request()
                    .AddAsync(fileAttachment);
        }
        else
        {
            // Attachments >= 3 Mb
            using (var filestream = System.IO.File.Open(attachment.FullPath,System.IO.FileMode.Open,FileAccess.Read,FileShare.None))
            {
                var attachmentItem = new AttachmentItem
                {
                    AttachmentType = AttachmentType.File,Name = Path.GetFileName(filestream.Name),Size = filestream.Length
                };

                var uploadSession = await _GraphClient
                        .Users[UserPrincipalNameOrId]
                        .Messages[draft.Id]
                        .Attachments
                        .CreateUploadSession(attachmentItem)
                        .Request()
                        .PostAsync();

                var maxSliceSize = 320 * 1024; // 320 KB - Change this to your slice size. 5MB is the default.
                var largeFileUploadTask = new LargeFileUploadTask<FileAttachment>(uploadSession,filestream,maxSliceSize);

                // upload away with relevant callback
                IProgress<long> progressCallback = new Progress<long>(prog => { });
                try
                {
                    var uploadResult = await largeFileUploadTask.UploadAsync(progressCallback);
                    if (!uploadResult.UploadSucceeded)
                    {
                        // error
                    }
                }
                catch (ServiceException e)
                {
                    // exception
                }
            } // using()
        }
    }
}

await _GraphClient
        .Users[UserPrincipalNameOrId]
        .Messages[draft.Id]
        .Send()
        .Request()
        .WithMaxRetry(5)
        .PostAsync();