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

使用PowerShell通过Graph API发送JSON正文邮件遇400错误求助

问题分析与解决方案

你遇到的HTTP 400错误主要来自两个核心问题:

  1. 手动拼接JSON导致格式破坏:直接把$content(JSON格式字符串)插入字符串模板时,其中的双引号、换行符等特殊字符会打乱外层JSON的语法结构,Graph API无法正常解析。
  2. 无效的contentType值:Graph API的message.body.contentType仅支持Text、HTML或RichText三种类型,不存在application/json这个选项,使用无效值会直接触发请求错误。

正确实现方式

不要手动拼接JSON字符串,而是通过PowerShell对象嵌套构建完整的邮件请求结构,最后统一转换为JSON,这样能自动处理所有特殊字符的转义问题。同时指定正确的contentType,并在请求中明确声明内容类型。

修正后的代码:

# 将数据转换为JSON字符串(作为邮件正文内容)
$content = $data | ConvertTo-Json -Depth 10

# 构建完整的邮件请求对象
$mailRequest = [PSCustomObject]@{
    message = [PSCustomObject]@{
        subject = $subject
        body = [PSCustomObject]@{
            contentType = "Text" # 如需格式化展示可改为HTML
            content = $content
        }
        toRecipients = @(
            [PSCustomObject]@{
                emailAddress = [PSCustomObject]@{
                    address = $recipient
                }
            }
        )
        attachments = @(
            [PSCustomObject]@{
                "@odata.type" = "#microsoft.graph.fileAttachment"
                name = $FileName
                contentType = "text/plain"
                contentBytes = $base64string
            }
        )
    }
    saveToSentItems = $false
}

# 转换为符合要求的JSON请求体
$BodyJsonsend = $mailRequest | ConvertTo-Json -Depth 10

$URLsend = "https://graph.microsoft.com/v1.0/users/$sender/sendMail"
Invoke-RestMethod -Method POST -Uri $URLsend -Headers $headers -Body $BodyJsonsend -ContentType "application/json"

关键注意事项

  • 用对象生成JSON:通过PowerShell自定义对象嵌套,再用ConvertTo-Json生成请求体,能自动处理字符串中的特殊字符转义,彻底避免手动拼接的语法错误。
  • contentType取值规范:邮件正文的contentType只能是Text、HTML或RichText。如果需要收件人看到原生JSON格式,用Text即可;如果要高亮或格式化展示,可将JSON转为HTML格式后使用HTML类型。
  • 声明请求内容类型:调用Invoke-RestMethod时必须加上-ContentType "application/json",确保Graph API正确识别并解析请求体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:47:23