Отправка электронной почты с помощью Gmail API, кодирование греческих символов в теле

#c# #character-encoding #gmail-api

#c# #кодировка символов #gmail-api

Вопрос:

Я обновляю приложение для отправки электронных писем, чтобы использовать 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 () я получаю этот результат
visualstudio-textview-mm-variable

Есть предложения по устранению проблемы с кодировкой?

Комментарии:

1. Кодирование должно использовать одну из кодировок Windows, например 1250,1251,1252, 1290, а не UTF8.

2. Попробуйте добавить это в границу тела HTML: content-transfer-encoding: utf8 или content-transfer-encoding: в кавычках-для печати для символов, отличных от ascii, и кодировки: windows-1253

3. Тип содержимого: текст / html; кодировка = UTF-8; Кодировка для передачи содержимого: 8 бит

4. @jdweng я перепробовал все эти кодировки, но в электронном письме отображаются греческие символы как? (вопросительные знаки)

5. @JamesDean как я могу это добавить? можете ли вы привести пример?

Ответ №1:

Однако не уверен, что это все еще актуально. Недавно столкнулся с такой же проблемой и потратил довольно много часов на попытки найти решение. И это оказалось довольно простым — не используйте MimeMessage.Метод toString(), поскольку авторы отметили его как «ненадежный». Вместо этого используйте writeTo (поток Stream).

Что-то вроде этого:

 MimeMessage mimeMessage = MimeMessage.CreateFromMailMessage(msg);
using (MemoryStream ms = new MemoryStream())
{
    mimeMessage.WriteTo(ms);
    return Convert.ToBase64String(ms.GetBuffer())
        .TrimEnd('=')
        .Replace(' ', '-')
        .Replace('/', '_');
}