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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:05:20