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

PowerShell调用SendGrid发邮件 主题正文变量前异常多出?字符

问题原因

这个多余的?是两个问题叠加导致的:

  • 你的$file变量里实际藏了一个零宽度不可见的Unicode控制字符(最常见的是UTF-8 BOM字符U+FEFF,一般是从文件读取、管道输出、复制外部内容时带入的)。这个字符在PowerShell控制台输出时不占显示宽度,肉眼完全看不到,所以你本地直接打印变量值时发现不了异常。
  • 你使用的Windows PowerShell 5.1版本中,Invoke-RestMethod默认不会以UTF-8编码发送请求Body,遇到这个不可见控制字符时无法正确转码,就会把它渲染成可见的?,最终SendGrid收到的邮件内容里就会多出这个字符。
修复步骤
  1. 验证隐藏字符存在
    给变量赋值后执行以下命令,如果返回的长度比你肉眼看到的字符数多1,就能确认存在隐藏字符:
    # test.zip肉眼看是7个字符,藏了隐藏字符时会返回8
    $file.Length
    
  2. 清理变量里的隐藏字符
    在拼接$downloadurl、传入邮件参数前,把变量里的BOM字符移除:
    $file = $file -replace [char]0xFEFF, ''
    $downloadurl = $downloadurl -replace [char]0xFEFF, ''
    
  3. 修复函数里的请求编码问题
    修改SendGridMail函数里的请求参数,显式指定UTF-8编码,从根源避免转码乱码问题,修改后的请求参数部分如下:
    $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
    
    这个写法兼容PowerShell 5.1和PowerShell 7+版本,修改后你其他复用这个函数的脚本也不会再出现同类乱码问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:45:38