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

使用REST API和PowerShell向多个收件人发送邮件

解决Office 365 API发送多收件人/抄送邮件的400错误问题

我来帮你搞定这个问题!你遇到的400 Bad Request错误,几乎可以肯定是手动拼接JSON时格式出错了——多个收件人(To)或抄送人(Cc)需要在数组中包含多个EmailAddress对象,而手动拼接字符串很容易出现引号转义错误或语法问题,导致服务器无法解析你的请求。

问题根源

你原来的代码中,ToRecipients和CcRecipients都是单元素数组,当你尝试添加多个收件人时,手动拼接的JSON很可能出现了格式错误(比如引号没转义、逗号位置不对、数组结构不完整等),服务器因此返回无效请求的报错。

解决方案:用PowerShell对象生成正确的JSON

推荐你放弃手动拼接JSON字符串,改用PowerShell对象配合ConvertTo-Json命令来生成格式绝对正确的请求体,这样完全避免转义错误的问题。

修改后的完整代码

[CmdletBinding()] 
param( 
    [Parameter(Mandatory=$True, ValueFromPipeline=$True, HelpMessage="Email Address e.g man1@whatever.com")] 
    [Alias('Email')] 
    $Subject, 
    $Content
) 

$UserName = "myUPN@mywork.com" 
$Password = cat C:\Creds\mycreds.txt | ConvertTo-SecureString 
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username,$password 
$contentType = "application/json;odata.metadata=full" 
$uri = "https://outlook.office365.com/api/v1.0/me/sendmail" 

# 构建邮件参数对象,支持多个收件人和抄送人
$messageParams = @{
    Subject = $Subject
    Importance = "High"
    Body = @{
        ContentType = "HTML"
        Content = $Content
    }
    # 多个收件人:数组中添加多个EmailAddress对象
    ToRecipients = @(
        @{ EmailAddress = @{ Address = "man1@whateverdomain.com" } },
        @{ EmailAddress = @{ Address = "man2@whateverdomain.com" } },
        @{ EmailAddress = @{ Address = "man3@whateverdomain.com" } } # 可以继续添加更多
    )
    # 多个抄送人:同样用数组包含多个对象
    CcRecipients = @(
        @{ EmailAddress = @{ Address = "cc1@whateverdomain.com" } },
        @{ EmailAddress = @{ Address = "cc2@whateverdomain.com" } } # 可以继续添加更多
    )
}

# 将对象转换为JSON,注意Depth参数要足够(嵌套层级多)
$body = @{ Message = $messageParams } | ConvertTo-Json -Depth 4

Invoke-RestMethod -Uri $uri -Method Post -Credential $cred -Body $Body -ContentType $contentType

关键说明

  1. 数组结构:ToRecipients和CcRecipients都是数组类型,每个元素是一个包含EmailAddress的哈希表,多个收件人就往数组里添加更多哈希表即可。
  2. ConvertTo-Json的Depth参数:因为邮件对象有多层嵌套(Message -> Body -> ContentType/Content,Message -> ToRecipients -> EmailAddress -> Address),默认的Depth=2会截断嵌套内容,所以必须指定足够大的Depth值(这里用4完全足够)。
  3. 避免手动拼接:手动拼接JSON字符串很容易出错,尤其是处理特殊字符或复杂结构时,用PowerShell对象转JSON是最可靠的方式。

如果你坚持要用手动拼接的方式(不推荐),正确的JSON格式应该是这样的(注意引号转义和数组结构):

{ 
    "Message":{ 
        "Subject": "你的主题", 
        "Importance": "High", 
        "Body": { 
            "ContentType": "HTML", 
            "Content": "邮件内容" 
        }, 
        "ToRecipients": [ 
            { "EmailAddress":{ "Address": "man1@whateverdomain.com" } },
            { "EmailAddress":{ "Address": "man2@whateverdomain.com" } }
        ], 
        "CcRecipients": [ 
            { "EmailAddress":{ "Address": "man2@whateverdomain.com" } },
            { "EmailAddress":{ "Address": "man3@whateverdomain.com" } }
        ] 
    }
}

但这种方式需要你手动处理所有引号的转义,很容易出错,所以还是推荐用对象转JSON的方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:00:43