PowerShell调用SendGrid发邮件 主题正文变量前异常多出?字符
问题原因
这个多余的?是两个问题叠加导致的:
- 你的
$file变量里实际藏了一个零宽度不可见的Unicode控制字符(最常见的是UTF-8 BOM字符U+FEFF,一般是从文件读取、管道输出、复制外部内容时带入的)。这个字符在PowerShell控制台输出时不占显示宽度,肉眼完全看不到,所以你本地直接打印变量值时发现不了异常。 - 你使用的Windows PowerShell 5.1版本中,
Invoke-RestMethod默认不会以UTF-8编码发送请求Body,遇到这个不可见控制字符时无法正确转码,就会把它渲染成可见的?,最终SendGrid收到的邮件内容里就会多出这个字符。
修复步骤
- 验证隐藏字符存在
给变量赋值后执行以下命令,如果返回的长度比你肉眼看到的字符数多1,就能确认存在隐藏字符:# test.zip肉眼看是7个字符,藏了隐藏字符时会返回8 $file.Length - 清理变量里的隐藏字符
在拼接$downloadurl、传入邮件参数前,把变量里的BOM字符移除:$file = $file -replace [char]0xFEFF, '' $downloadurl = $downloadurl -replace [char]0xFEFF, '' - 修复函数里的请求编码问题
修改SendGridMail函数里的请求参数,显式指定UTF-8编码,从根源避免转码乱码问题,修改后的请求参数部分如下:
这个写法兼容PowerShell 5.1和PowerShell 7+版本,修改后你其他复用这个函数的脚本也不会再出现同类乱码问题。$BodyJson = $SendGridBody | ConvertTo-Json -Depth 10 $Header = @{ "authorization" = "Bearer $APIKey" } $Parameters = @{ Method = "POST" Uri = "https://api.sendgrid.com/v3/mail/send" Headers = $Header # 显式指定UTF-8字符集 ContentType = "application/json; charset=utf-8" # 把JSON转成无BOM的UTF-8字节数组发送,避免默认编码转义异常 Body = [System.Text.Encoding]::UTF8.GetBytes($BodyJson) } Invoke-RestMethod @Parameters
内容的提问来源于stack exchange,提问作者DanielB
相关产品推荐
相关产品推荐

