如何实现Microsoft Graph邮件延迟发送?方案无效求助
解决Microsoft Graph邮件延迟发送无效问题
问题核心原因
你当前使用的SendMail API会直接触发邮件立即发送,完全忽略延迟发送相关的扩展属性或配置。要实现延迟发送,必须改用先创建草稿邮件,再触发延迟发送的流程。
方案一:使用Graph原生延迟发送字段(推荐)
Microsoft Graph API v1.0及以上支持原生的scheduleSendDateTime属性,无需依赖扩展属性,兼容性和稳定性更好:
var message = new Message { Subject = Subject, Body = new ItemBody { ContentType = BodyType.Html, Content = bodyText }, ToRecipients = new List<Recipient>() { new Recipient { EmailAddress = new EmailAddress { Address = recipient } } }, // 务必转换为UTC时间,避免时区偏差 ScheduleSendDateTime = DateTimeToSend.ToUniversalTime() }; // 第一步:创建草稿邮件 var draftMessage = await graphServiceClient.Me .Messages .Request() .AddAsync(message); // 第二步:发送草稿,邮件会按设置的时间延迟发送 await graphServiceClient.Me .Messages[draftMessage.Id] .Send() .Request() .PostAsync();
方案二:使用扩展属性(兼容旧场景)
如果必须依赖扩展属性实现,同样需要走草稿流程,且要确保扩展属性ID格式正确:
var message = new Message { Subject = Subject, Body = new ItemBody { ContentType = BodyType.Html, Content = bodyText }, ToRecipients = new List<Recipient>() { new Recipient { EmailAddress = new EmailAddress { Address = recipient } } }, SingleValueExtendedProperties = new MessageSingleValueExtendedPropertiesCollectionPage { new SingleValueLegacyExtendedProperty() { // 完整的扩展属性ID格式 Id = "SystemTime {00062008-0000-0000-C000-000000000046} Name 0x3FEF", // 转换为UTC时间并按ISO 8601格式输出 Value = DateTimeToSend.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ") } } }; // 创建草稿邮件 var draftMessage = await graphServiceClient.Me .Messages .Request() .AddAsync(message); // 发送草稿触发延迟发送 await graphServiceClient.Me .Messages[draftMessage.Id] .Send() .Request() .PostAsync();
关键注意事项
- 所有时间必须转换为UTC时间,否则会出现时区导致的发送时间偏差
- 禁止直接使用
SendMail方法,该方法会绕过所有延迟发送配置,直接立即发送邮件 - 优先使用原生
scheduleSendDateTime字段,扩展属性仅作为旧环境的兼容方案
内容的提问来源于stack exchange,提问作者kylescudder
相关产品推荐
相关产品推荐

