使用 Gmail API 发送电子邮件,在正文中编码希腊字符

Posted

技术标签:

【中文标题】使用 Gmail API 发送电子邮件,在正文中编码希腊字符【英文标题】:Sending Email with Gmail API, Encoding Greek characters in body 【发布时间】:2019-08-19 12:37:55 【问题描述】:

我正在更新用于发送电子邮件的应用程序以使用 GMAIL API 而不是 SMTP。

我遇到了电子邮件编码问题。主体按应有的方式显示,但身体未正确显示。 [下面是收到邮件的截图]

我用来发送电子邮件的代码:

public bool SendMailGmailAPI(System.Net.Mail.MailMessage mailMessage, GmailService service)
    
        bool isEverythingOK = false;
        try
        
            var mimeMessage = MimeKit.MimeMessage.CreateFromMailMessage(mailMessage);

            string mm = mimeMessage.ToString();
            var gmailMessage = new Google.Apis.Gmail.v1.Data.Message
            
                Raw = Encode(mm)
            ;

            UsersResource.MessagesResource.SendRequest request = service.Users.Messages.Send(gmailMessage, mailMessage.From.Address);
            request.Execute();
            isEverythingOK = true;
        
        catch (Exception e)
        
            ErrorMessage = e.Message;
            isEverythingOK = false;
        
        return isEverythingOK;
    


public static string Encode(string text)
        
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(text);

          return  System.Convert.ToBase64String(bytes)
                .Replace('+', '-')
                .Replace('/', '_')
                .Replace("=", "");
        

mailMessage 是由此生成的:

      public MailMessage CreateEmailMessage(string mailto="")
        
            EmailMessageToSend = new MailMessage();
            //setting from, to, cc, bcc, replyto

            //make body
            EmailMessageToSend.BodyEncoding = System.Text.Encoding.UTF8;
            //EmailMessageToSend.HeadersEncoding = System.Text.Encoding.UTF8;
            EmailMessageToSend.SubjectEncoding = System.Text.Encoding.UTF8;

            EmailMessageToSend.IsBodyhtml = true;

            EmailMessageToSend.Body = Body + "<hr>";
            EmailMessageToSend.Body += DateTime.Now.ToString("dd.MM.yyyy HH:mm");
            EmailMessageToSend.Body += "<br /><br />ΔΗΛΩΣΗ ΕΜΠΙΣΤΕΥΤΙΚΟΤΗΤΑΣ / ΑΠΟΠΟΙΗΣΗ ΕΥΘΥΝΗΣ <br /> Αυτό το μήνυμα περιέχει εμπιστευτικές και απόρρητες πληροφορίες και η χρήση τους επιτρέπεται μόνον από τον αναφερόμενο παραλήπτη. Σε περίπτωση που περιέλθει σε σας από λάθος, παρακαλούμε να το διαγράψετε άμεσα από το σύστημά σας ή να το καταστρέψετε και να ειδοποιήσετε τον αποστολέα.  <br /><br />" +" CONFIDENTIALITY WARNING / DISCLAIMER <br /> The information in this email is confidential and is intended solely for the addressee(s). If you have received this transmission in error, and you are not an intended recipient, be aware that any disclosure, copying, distribution or use of this transmission or its contents is prohibited.";

            var htmlView = AlternateView.CreateAlternateViewFromString(EmailMessageToSend.Body, null, "text/html");
            EmailMessageToSend.Subject = Subject+" - Mail v2.0";

            return EmailMessageToSend;
        

在 mimeMessage.ToString() 我得到这个结果

关于如何解决编码问题有什么建议吗?

【问题讨论】:

编码应该使用 Windows 编码之一,例如 1250,1251,1252, 1290 而不是 UTF8。 尝试在 HTML 正文边界添加此内容:content-transfer-encoding:utf8 或 content-transfer-encoding:quoted-printable 用于非 ascii 字符和字符集:windows-1253 内容类型:文本/html;字符集=UTF-8;内容传输编码:8bit @jdweng 我尝试了所有这些编码,但电子邮件显示希腊字符为? (问号) @JamesDean 我该如何添加它?可以举个例子吗? 【参考方案1】:

但不确定它是否仍然相关。 最近遇到了同样的问题,并花了相当多的时间试图找到解决方案。它看起来很简单——不要使用 MimeMessage.ToString() 方法,因为它被作者标记为“不可靠”。请改用 WriteTo(Stream stream)。

类似这样的:

MimeMessage mimeMessage = MimeMessage.CreateFromMailMessage(msg);
using (MemoryStream ms = new MemoryStream())

    mimeMessage.WriteTo(ms);
    return Convert.ToBase64String(ms.GetBuffer())
        .TrimEnd('=')
        .Replace('+', '-')
        .Replace('/', '_');

【讨论】:

以上是关于使用 Gmail API 发送电子邮件,在正文中编码希腊字符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET 中使用具有 HTML 正文 + 附件的 GMAIL API 发送电子邮件

在调用gmail api发送带附件的电子邮件(multipart)时,请求的正文如何?

调用 gmail api 以发送带有附件(多部分)的电子邮件时,请求的正文如何?

使用 Gmail API 发送的邮件中缺少附件,但仅适用于收件人

Gmail API 仍然使用从 HTML 自动生成的替代正文部分替换 text/plain 替代正文部分

如何使用来自 postmnan 本机应用程序的 gmail rest api 发送邮件