通过Microsoft Graph创建M365邮件时ISO-8859-2编码HTML渲染异常求助
解决方案
方法1:通过internetMessageContent将原始MIME内容存入指定文件夹
你提到MIME格式导入可正常渲染但无法放入指定文件夹,其实可以利用POST /beta/users/{user-id}/mailFolders/{folder-id}/messages端点结合internetMessageContent字段实现:
- 把完整的RFC822格式MIME邮件(需包含
Content-Type: text/html; charset=ISO-8859-2头信息和原始HTML内容)转换为Base64编码字符串。 - 构造如下JSON请求体:
{ "internetMessageContent": { "contentType": "message/rfc822", "content": "BASE64_ENCODED_MIME_CONTENT" } }
- 发送POST请求到目标文件夹的消息端点,邮件会完整存入指定文件夹,且保留原始编码规则,渲染显示正常。
方法2:正确转换编码后使用body字段构造邮件
若你仍想使用body字段,需先将ISO-8859-2编码的HTML做正确编码转换:
- 将ISO-8859-2编码的HTML字节流解码为Unicode字符串(比如通过代码
bytes.fromhex("E1").decode("iso-8859-2")可得到正确的á字符)。 - 把该Unicode字符串直接作为
body.content的值,保留原HTML中的<meta charset="ISO-8859-2">标签无需修改。 - 请求体示例:
{ "subject": "测试主题", "body": { "contentType": "html", "content": "<html><head><meta charset=\"ISO-8859-2\"></head><body>Zápis GDPR</body></html>" } }
这种方式下,Graph以UTF-8处理JSON内容,但解码后的Unicode字符是正确的,邮件客户端会根据meta标签识别字符集,最终显示正常。
关键注意事项
- 禁止直接将ISO-8859-2字节当作UTF-8字符串传入,这会导致你遇到的
0xE1被错误转为c4 8f这类乱码问题。 - 确保请求头的
Content-Type设置为application/json; charset=utf-8,保证JSON本身的编码正确性。
内容的提问来源于stack exchange,提问作者Jeff McKay
相关产品推荐
相关产品推荐

