使用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,步骤如下:
- 获取目标邮件的
MessageId(通过上述草稿方式或查询已发送文件夹); - 调用
GET /me/messages/{id}/content接口,返回base64编码的MIME内容; - 将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
相关产品推荐
相关产品推荐

