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

Gmail API调用MimeMessage报收件人必填错误与base64url编码问题咨询

修复方案

核心问题说明

你遇到的400报错由两个原因导致:

  1. 直接调用MimeMessage.ToString()得到的是调试用格式化字符串,不是符合Gmail API要求的标准RFC 2822字节流,这也是你发现解码后内容一致、编码结果不同的根本原因
  2. 自行拼接的纯文本邮件刚好符合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:18:03