问题描述
我已经使用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();