使用PowerShell通过Graph API发送JSON正文邮件遇400错误求助
问题分析与解决方案
你遇到的HTTP 400错误主要来自两个核心问题:
- 手动拼接JSON导致格式破坏:直接把
$content(JSON格式字符串)插入字符串模板时,其中的双引号、换行符等特殊字符会打乱外层JSON的语法结构,Graph API无法正常解析。 - 无效的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
相关产品推荐
相关产品推荐

