Gmail API调用MimeMessage报收件人必填错误与base64url编码问题咨询
修复方案
核心问题说明
你遇到的400报错由两个原因导致:
- 直接调用
MimeMessage.ToString()得到的是调试用格式化字符串,不是符合Gmail API要求的标准RFC 2822字节流,这也是你发现解码后内容一致、编码结果不同的根本原因 - 自行拼接的纯文本邮件刚好符合Gmail API的兼容逻辑,而MimeKit格式化输出的字符串存在Gmail API无法识别的不可见格式化字符,
To:后空格本身是表面现象。
可行修复代码
不需要做正则替换,也不需要手动拼接邮件头,直接用MimeKit原生方法导出标准邮件流即可:
var mailMessage = new MailMessage { Subject = "test subject", Body = "<h1>test body</h1>" }; mailMessage.IsBodyHtml = true; // 注意:这里要填写完整合规的收件人邮箱地址,不要填写不完整的testemail mailMessage.To.Add("test@test.com"); MimeMessage mm = MimeMessage.CreateFromMailMessage(mailMessage); // 核心修改:用WriteTo导出标准RFC2822字节流,替代ToString() using var memoryStream = new MemoryStream(); mm.WriteTo(memoryStream); // 生成符合Gmail要求的Base64Url编码 string rawMessage = Convert.ToBase64String(memoryStream.ToArray()) .Replace('+', '-') .Replace('/', '_') .Replace("=", string.Empty); var gmailMessage = new Google.Apis.Gmail.v1.Data.Message { Raw = rawMessage }; service.Users.Messages.Send(gmailMessage, "me").Execute();
补充说明
- RFC 2822规范本身允许邮件头字段名和值之间存在空格,你之前查到的相关描述有误,不需要特意处理空格
- 之前正则替换失效是因为
ToString()输出的To:后的空白不是普通半角空格,可能是制表符或者带换行的缩进格式,你写的正则规则只能匹配普通空格所以没有生效
内容的提问来源于stack exchange,提问作者Amrit
相关产品推荐
相关产品推荐

