PowerShell调用Graph API发邮件HTML截断、TEXT空格折叠问题咨询
Microsoft Graph API 邮件发送异常修复方案
1. HTML格式正文截断、标签明文显示问题修复
- 根因:请求体JSON序列化异常/内容被截断,常见于VBA直接通过命令行传参给PowerShell时触发命令行长度限制,或是内容中的特殊字符打断JSON结构
- 操作步骤:
- VBA侧禁止通过命令行参数传递正文内容,改为写入临时文本文件,PowerShell侧读取临时文件获取完整正文,规避命令行长度截断问题
- PowerShell构造请求体时强制使用
ConvertTo-Json自动处理转义,禁止手动拼接JSON字符串,参考代码:
# 读取VBA写入的临时文件获取正文 $htmlContent = Get-Content -Path "C:\temp\mail_body.tmp" -Raw -Encoding UTF8 $mailParams = @{ message = @{ subject = $mailSubject body = @{ contentType = "HTML" content = $htmlContent } toRecipients = @(@{ emailAddress = @{ address = $recipientMail } }) } saveToSentItems = $true } # 序列化时指定足够深度避免结构截断 $requestBody = $mailParams | ConvertTo-Json -Depth 10- VBA构造HTML时提前转义特殊字符:将
"替换为"、&替换为&、</>替换为</>
2. TEXT格式空格折叠、Char(160)明文显示问题修复
- 根因:纯文本邮件默认遵循RFC 2646的flowed text规范,连续空格会被自动折叠;Char(160)是HTML专有的非断空格实体,纯文本模式下不会被渲染为空格
- 操作步骤:
- 放弃替换Char(32)为Char(160)的方案,若必须使用纯文本格式,在需要保留的连续空格前添加ASCII 13软换行符,或是将行首空格替换为制表符
\t - 更简单的兼容方案:仍使用HTML格式,将纯文本内容包裹在
<pre>标签中,自动保留所有空格、换行排版,无需额外处理:
<pre style="font-family: Consolas, monospace; margin: 0;"> 你的原纯文本内容,所有空格、换行都会原样保留 </pre>- 若坚持使用纯TEXT格式,调用Graph API时添加请求头
Prefer: outlook.body-content-type="text",同时确保正文内容编码为UTF-8无BOM格式
- 放弃替换Char(32)为Char(160)的方案,若必须使用纯文本格式,在需要保留的连续空格前添加ASCII 13软换行符,或是将行首空格替换为制表符
内容的提问来源于stack exchange,提问作者Dan Mumford
相关产品推荐
相关产品推荐

