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

使用Graph API发送邮件时如何获取/设置MessageId?

Graph API SendMail 相关问题解答

1. 如何获取已发送邮件的MessageId?

调用SendMail接口成功仅返回202 Accepted且无响应体,无法直接从响应中获取MessageId,可通过两种方式获取:

  • 方式一:先创建草稿再发送:先调用创建草稿接口(POST /me/messages),成功后会返回包含Id(即MessageId)的邮件对象,再调用发送草稿接口(POST /me/messages/{id}/send)。这种方式能提前拿到MessageId,但需要两次API调用。
  • 方式二:发送后查询已发送文件夹:发送完成后,去用户的已发送邮件文件夹(/me/mailFolders/SentItems/messages)查询,通过邮件主题、收件人、发送时间等唯一标识过滤,找到对应邮件后获取其Id。注意:邮件可能存在同步延迟,需适当等待或重试。

2. 是否可以在发送前自行设置MessageId?

不可以。MessageId是由Exchange服务器生成的唯一标识,客户端无法预先指定,只能由服务器在创建邮件(草稿或直接发送)时分配。

3. 是否必须先保存草稿再调用发送接口?

不是必须的。如果不需要提前获取MessageId,直接调用SendMail接口一次即可完成发送。只有当你需要提前拿到MessageId时,才需要先创建草稿再发送,也就是两次API调用。

代码示例:先创建草稿再发送(获取MessageId)

var options = new TokenCredentialOptions { AuthorityHost = AzureAuthorityHosts.AzurePublicCloud };
var credentials = new UsernamePasswordCredential(configuration.EmailAddress, configuration.Password, 
    configuration.TenantId, configuration.ClientId, options);

var graphClient = new GraphServiceClient(credentials, new[] { "https://graph.microsoft.com/.default" });

// 构建邮件内容
var draftMessage = new Message
{
    Subject = "你的邮件主题",
    Body = new ItemBody { ContentType = BodyType.Html, Content = "<p>邮件内容</p>" },
    ToRecipients = new List<Recipient>
    {
        new Recipient { EmailAddress = new EmailAddress { Address = "recipient@example.com" } }
    }
};

// 创建草稿,获取MessageId
var savedDraft = await graphClient.Me.Messages.PostAsync(draftMessage);
string messageId = savedDraft.Id;

// 发送草稿
await graphClient.Me.Messages[messageId].Send.PostAsync();

如何获取实际发送的邮件内容?

可以通过Graph API获取邮件的MIME内容,再转换为MemoryStream,步骤如下:

  1. 获取目标邮件的MessageId(通过上述草稿方式或查询已发送文件夹);
  2. 调用GET /me/messages/{id}/content接口,返回base64编码的MIME内容;
  3. 将base64内容解码为字节数组,再转为MemoryStream,可直接用MimeKit处理。

代码示例:

// 假设已获取到messageId
string base64MimeContent = await graphClient.Me.Messages[messageId].Content.GetAsync();

// 解码并转换为MemoryStream
byte[] mimeBytes = Convert.FromBase64String(base64MimeContent);
using var memoryStream = new MemoryStream(mimeBytes);

// 可选:用MimeKit加载处理
var mimeMessage = MimeKit.MimeMessage.Load(memoryStream);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:25:00