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

使用MailMessage调用MS Graph API发邮件报400错误,匿名类型正常

问题原因与解决方案

核心问题

MailMessage类的序列化结构和Microsoft Graph API要求的Message资源结构不匹配——即使JSON语法无错误,字段名、嵌套层级的差异会导致API无法正确解析请求,最终返回400 Bad Request。

关键差异点

  • 收件人/发件人结构:MailMessage的To/From序列化后是{"Address":"xxx","DisplayName":"xxx"}格式,而Graph API要求嵌套在emailAddress对象中,字段名是name而非DisplayName,数组字段名是toRecipients/from而非To/From。
  • 邮件正文:MailMessage的Body是纯字符串,Graph API要求body是包含contentType(Text或HTML)和content的对象。
  • 抄送/密送字段:MailMessage的CC/BCC对应Graph API的ccRecipients/bccRecipients,结构同样需要嵌套emailAddress。

解决方法

不要直接序列化MailMessage,而是将其属性映射为符合Graph API规范的结构(匿名类型或自定义类均可),示例代码如下:

// 从现有MailMessage提取属性,构建Graph要求的消息结构
var graphCompatibleMessage = new
{
    subject = mailMessage.Subject,
    body = new
    {
        contentType = mailMessage.IsBodyHtml ? "HTML" : "Text",
        content = mailMessage.Body
    },
    toRecipients = mailMessage.To.Select(addr => new
    {
        emailAddress = new
        {
            address = addr.Address,
            name = addr.DisplayName
        }
    }).ToList(),
    from = new
    {
        emailAddress = new
        {
            address = mailMessage.From.Address,
            name = mailMessage.From.DisplayName
        }
    },
    // 如有抄送/密送,添加以下部分
    ccRecipients = mailMessage.CC.Select(addr => new
    {
        emailAddress = new
        {
            address = addr.Address,
            name = addr.DisplayName
        }
    }).ToList(),
    bccRecipients = mailMessage.Bcc.Select(addr => new
    {
        emailAddress = new
        {
            address = addr.Address,
            name = addr.DisplayName
        }
    }).ToList()
};

// 序列化graphCompatibleMessage后调用Graph API即可

验证建议

将映射后的匿名类型序列化,和之前成功发送的匿名类型JSON对比,确保结构完全一致后再调用API测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:52:17