невозможно закодировать электронную почту со специальными символами в правильном формате, gmail api и ae.net.mail

Я работаю над приложением, которое может отправлять электронные письма с вложениями, и оно работает, пока я не попробую специальные символы æ, ø, å.

введите здесь описание изображения

Я немного поигрался с тестированием различных кодировок, и похоже, что тема кодируется в ISO-8859-1, а остальная часть почты кодируется в UTF-8.

Вот мой метод, который генерирует сообщение API Google Gmail

        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.


person dark2222    schedule 25.06.2017    source источник
comment
откуда этот скрин?   -  person DaImTo    schedule 26.06.2017


Ответы (1)


Вы можете использовать следующий метод для использования UTF-8 в заголовке темы.

=?charset?encoding?encoded-text?=

Затем вы можете использовать charset=utf-8, encoding=B (B = base64) и закодировать тему как encoded-text.

Пример

Subject: =?utf-8?B?aGVsbG8=?= // 'aGVsbG8=' is 'hello' in base64 format.
person Tholle    schedule 26.06.2017
comment
Я не знаю, в чем разница, так как я уже тестировал это, но каким-то образом ваш пример сработал для меня. - person dark2222; 26.06.2017