使用Gmail API和MimeKit发送邮件时出现Â异常字符问题
解决Gmail API发送邮件时签名中出现Â字符的问题
问题原因
出现Â字符的核心是编码处理错误:从Gmail获取的签名包含Unicode不间断空格(U+00A0),当前代码通过mimeMsg.ToString()将MIME邮件转为字符串,再转UTF-8字节进行Base64编码的过程中,破坏了原始编码信息,导致非标准字符被错误解析为Â。
解决方案
直接使用MimeKit的WriteTo方法输出原始字节流,跳过字符串转换环节,确保编码一致性。
修改后的关键代码
// 替换原有的msg.Raw生成逻辑 using var stream = new MemoryStream(); mimeMsg.WriteTo(stream); stream.Position = 0; var messageBytes = stream.ToArray(); msg.Raw = Base64UrlEncode(messageBytes); // 同步修改Base64UrlEncode方法,直接接收字节数组 string Base64UrlEncode(byte[] input) { return Convert.ToBase64String(input) .Replace("+", "-") .Replace("/", "_") .Replace("=", ""); }
额外优化(可选)
如果签名中存在大量非标准空格,可在获取签名后替换为普通空格,进一步避免编码歧义:
// 在DoAuthenticationAsync方法中获取签名后添加 mySignature = itm.Signature.Replace("\u00A0", " ");
原理说明
- MimeKit的
WriteTo方法会严格按照MIME规范输出编码后的字节流,避免字符串转换时的编码丢失或错误。 - 直接基于原始字节进行Base64Url编码,确保Gmail API接收到的内容完全符合要求,不会出现乱码字符。
内容的提问来源于stack exchange,提问作者Shane Brodie
相关产品推荐
相关产品推荐

