You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Microsoft GraphAPI中ItemAttachment内嵌FileAttachment丢失问题排查

问题原因及解决方案

当你直接将本地构造的Message对象作为ItemAttachment的Item属性附加时,Microsoft Graph API 在处理SendMail请求时,不会递归处理嵌套的FileAttachments。只有当被附加的邮件是已经存储在Exchange服务器上的对象(比如草稿邮件),并通过ID引用时,才能完整保留其附件。

修正步骤

  • 先将包含FileAttachment的原始邮件保存为草稿,获取它的服务器ID
  • 创建ItemAttachment时,不再传递本地构造的Message对象,而是通过ID引用已保存的草稿邮件
  • 发送包含该ItemAttachment的目标邮件

修正后的代码示例

1. 保存原始邮件为草稿并获取ID

var originalEmail = PrepareMessage(email, isHtml, inputFolderPath);
// 将带附件的邮件保存为服务器草稿
var savedDraft = await graphClient.Users[userEmail].Messages.PostAsync(originalEmail);
string draftMessageId = savedDraft.Id;

2. 创建ItemAttachment并发送目标邮件

var anotherEmail = new Message{
    // 填充目标邮件的基础属性
    ToRecipients = new List<Recipient> { new Recipient { EmailAddress = new EmailAddress { Address = "target@example.com" } } },
    Subject = "包含嵌套邮件附件的邮件",
    Body = new ItemBody { Content = "请查看附件中的邮件内容", ContentType = BodyType.Text }
};

// 通过草稿ID创建ItemAttachment
var itemAttachment = new ItemAttachment
{
    Name = "Att1",
    Id = draftMessageId, // 关键:使用服务器草稿的ID,而非本地Message对象
    IsInline = false
};

anotherEmail.Attachments.Add(itemAttachment);

var messagePayload = new SendMailPostRequestBody { Message = anotherEmail, SaveToSentItems = true };
await graphClient.Users[userEmail].SendMail.PostAsync(messagePayload);

3. 原PrepareMessage方法无需修改

你编写的PrepareMessage方法用于构造带FileAttachment的邮件是正确的,不需要调整。

补充说明

你之前尝试保存草稿后仍出现附件丢失,大概率是因为仍将本地Message对象赋值给ItemAttachment.Item,而非使用草稿的服务器ID。只有通过ID引用服务器上已存在的邮件,Graph API才会完整加载该邮件的所有内容(包括附件)并作为ItemAttachment附加。

内容的提问来源于stack exchange,提问作者Venkatesh Dharavath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 15:34:51