无法以正确的格式、gmail api 和 ae.net.mail 对特殊字符电子邮件进行编码

Posted

技术标签:

【中文标题】无法以正确的格式、gmail api 和 ae.net.mail 对特殊字符电子邮件进行编码【英文标题】:unable to encode special characters email in right format, gmail api & ae.net.mail 【发布时间】:2017-11-28 15:38:27 【问题描述】:

我正在开发一个可以发送带有附件的电子邮件的应用程序,它可以正常工作,直到我尝试使用特殊字符 æ、ø、å。

我测试了不同的编码,看起来主题是用 ISO-8859-1 编码的,而邮件的其余部分是用 UTF-8 编码的。

这是我生成 Google Gmail API 消息的方法

        public Message CreateMessage(string to, string from, string body, string subject, GmailService service, string[] files = null, string bcc = null)
    
        AE.Net.Mail.MailMessage message = new AE.Net.Mail.MailMessage()
        
            Subject = subject,
            Body = body,
            From = new MailAddress(from),
        ;

        message.To.Add(new MailAddress(to));
        message.ReplyTo.Add(message.From);

        message.Headers.Add("Content-Type", "text/plain; charset=utf-8");

        if (bcc != null)
            message.Bcc.Add(new MailAddress(bcc));

        if (files != null)
        
            foreach(string file in files)
            
                using (var opennedFile = File.Open(file, FileMode.Open, FileAccess.Read))
                using (MemoryStream stream = new MemoryStream())
                
                    string[] FileName = file.Split('\\');
                    opennedFile.CopyTo(stream);
                    message.Attachments.Add(new AE.Net.Mail.Attachment(stream.ToArray(), MediaTypeNames.Application.Octet, FileName[FileName.Length - 1], true));
                
            
        

        var msgStr = new StringWriter();
        message.Save(msgStr);

        return new Message() 
            Raw = Base64UrlEncode(msgStr.ToString()),
        ;
    

    private static string Base64UrlEncode(string message)
    
        var inputBytes = Encoding.GetEncoding("utf-8").GetBytes(message);
        return Convert.ToBase64String(inputBytes).Replace('+', '-').Replace('/', '_').Replace("=", "");
    

message.ContentType = "text/plain; charset=utf-8" 无法解决此问题,并使附件在正文中显示为 Base64

【问题讨论】:

屏幕截图来自哪里? 【参考方案1】:

您可以使用 the following technique 在主题标头中使用 UTF-8。

=?charset?encoding?encoded-text?=

然后您可以使用charset=utf-8encoding=B (B = base64),并将主题编码为encoded-text

示例

Subject: =?utf-8?B?aGVsbG8=?= // 'aGVsbG8=' is 'hello' in base64 format.

【讨论】:

我不知道有什么区别,因为我已经测试过了,但不知何故你的例子对我有用

以上是关于无法以正确的格式、gmail api 和 ae.net.mail 对特殊字符电子邮件进行编码的主要内容,如果未能解决你的问题,请参考以下文章

与用于日期查询的 Gmail Web UI 相比,Gmail API 未返回正确的电子邮件

如何通过 gmail-api for python 发送 HTML 格式的电子邮件

Gmail api 范围和格式不匹配

Javascript fetch 无法从 GMail API Batch 请求中读取 Multipart 响应

电子邮件未格式化为 gmail

Gmail API:解码邮件正文(Java/Android)