使用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
关键说明
- 数组结构:
ToRecipients和CcRecipients都是数组类型,每个元素是一个包含EmailAddress的哈希表,多个收件人就往数组里添加更多哈希表即可。 - ConvertTo-Json的Depth参数:因为邮件对象有多层嵌套(Message -> Body -> ContentType/Content,Message -> ToRecipients -> EmailAddress -> Address),默认的
Depth=2会截断嵌套内容,所以必须指定足够大的Depth值(这里用4完全足够)。 - 避免手动拼接:手动拼接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
相关产品推荐
相关产品推荐

