如何从Microsoft Graph API的SendMail操作直接获取已发送邮件ID?
如何通过Microsoft Graph API的SendMail操作直接获取已发送邮件的ID?
我在.NET应用中使用Microsoft Graph API发送邮件,当前代码如下:
await client.Users[model.From] .SendMail(message, true) .Request() .PostAsync(cancellationToken) .ConfigureAwait(false);
这段代码能成功发送邮件,但SendMail方法不会返回已发送邮件的直接信息,尤其是无法获取邮件ID,而我需要在应用中追踪该ID以备后续使用。
我曾尝试调用SendMail后从“Sent Items”文件夹获取最新邮件,但这种方式可靠性存疑:
var sentItems = await client.Users[model.From] .MailFolders["SentItems"] .Messages .Request() .Top(1) .OrderBy("receivedDateTime desc") .GetAsync(); string messageId = sentItems.CurrentPage.FirstOrDefault()?.Id;
我还考虑过手动设置邮件ID,但了解到该字段会被服务器忽略,由服务器自动分配。
请问是否存在其他方式可直接从SendMail操作中获取已发送邮件的ID?
解决方案
可以通过添加Prefer: return=representation请求头,让Microsoft Graph API在执行SendMail操作后返回已发送邮件的完整实体,从而直接获取邮件ID。
修改后的代码示例:
var request = client.Users[model.From] .SendMail(message, true) .Request(); // 添加请求头,要求返回已发送邮件的实体 request.Header("Prefer", "return=representation"); // 执行请求并获取返回的邮件对象 var sentMessage = await request.PostAsync(cancellationToken).ConfigureAwait(false); // 直接获取邮件ID string messageId = sentMessage.Id;
说明
Prefer: return=representation是Microsoft Graph API支持的请求头,用于指定操作完成后返回资源的完整表示,适用于包括SendMail在内的多个创建/修改类操作。- 这种方式避免了从“Sent Items”文件夹查询的潜在问题(比如并发场景下最新邮件可能不是刚发送的那封),是官方推荐的可靠方案。
- 手动设置邮件ID确实会被服务器覆盖,无法通过这种方式自定义或提前获取ID。
内容的提问来源于stack exchange,提问作者Alireza Noori
相关产品推荐
相关产品推荐

