在电子邮件中编码为UTF-8

Rob*_*len 6 .net c# email encoding utf-8

我有一个客户端接收错误编码的电子邮件.我正在使用System.Net.Mail类并将正文编码设置为UTF-8.我已经做了一些阅读,因为我必须将电子邮件的正文设置为将数据编码为UTF-8字节数组的字符串,因为我必须转换回UTF-字符串16.正确?

当我发送: Il s'agit d'un message de testpourdéterminercomlelessystèmevaérerlesmessagesenvoyésàl'aidedescaractèresfrançais.Merci etbonnejournée.

他们看到: *Il s'agit d'un message de testpourdéterminercommentlesystèmevagérersles messagesenvoyésÃ'aidedescaractèresfrançais.

Merci etbonnejournée.*

我在电子邮件上尝试了不同的编码,但我真的怀疑客户端错误地解码了电子邮件,因为我的电子邮件客户端正确显示了这一点.我错过了什么吗?还有其他事情可以做吗?

代码如下

SmtpMailService.SendMail(string.Empty, toAddress, "emailaddress@emai.com", "", subject, sb.ToString(), false);

 public static bool SendMail(string fromAddress, string toAddress, string ccAddress, string bccAddress, string subject, string body, bool isHtmlBody)
    {

        if (String.IsNullOrEmpty(toAddress)) return false;
        var toMailAddress = new MailAddress(toAddress);

        var fromMailAddress = new MailAddress(String.IsNullOrEmpty(fromAddress) ? DefaultFromAddress : fromAddress);

        var mailMessage = new MailMessage(fromMailAddress, toMailAddress);

        if (!String.IsNullOrEmpty(ccAddress))
        {
            mailMessage.CC.Add(new MailAddress(ccAddress));
        }

        if (!String.IsNullOrEmpty(bccAddress))
        {
            mailMessage.Bcc.Add(new MailAddress(bccAddress));
        }

        if (!string.IsNullOrEmpty(fromAddress)) mailMessage.Headers.Add("Reply-To", fromAddress);

        mailMessage.Subject = subject;
        mailMessage.IsBodyHtml = isHtmlBody;
        mailMessage.Body = body;
        mailMessage.BodyEncoding = System.Text.Encoding.UTF8;

        var enableSslCfg = ConfigurationManager.AppSettings["Email.Ssl"];
        var enableSsl = string.IsNullOrEmpty(enableSslCfg) || bool.Parse(enableSslCfg);
        var client = new SmtpClient {EnableSsl = enableSsl};

        client.Send(mailMessage);


        return true;
    }
Run Code Online (Sandbox Code Playgroud)

edo*_*oft 8

最终解决了我的问题的是在备用视图上设置内容类型。尽管 Gmail 正确显示了电子邮件,但仅设置 msg.BodyEncoding 在(除其他外)Outlook 中不起作用。

    var msg = new MailMessage()
    msg.BodyEncoding = Encoding.GetEncoding(1252);
    msg.IsBodyHtml = true;
    //htmlBody is a string containing the entire body text
    var htmlView = AlternateView.CreateAlternateViewFromString(htmlBody, new ContentType("text/html"));
    //This does the trick
    htmlView.ContentType.CharSet = Encoding.UTF8.WebName;
    msg.AlternateViews.Add(htmlView);
Run Code Online (Sandbox Code Playgroud)


Gyö*_*zeg 5

您的示例清楚地表明您发送的文本具有 UTF-8 编码,该编码被解释为 Windows-1252 或 ISO-8859-1 编码(请参阅几个编码错误的结果,尤其是此处表中的最后一行

所以你的代码似乎没问题,问题可能是客户端只是忽略了邮件正文的编码(例如,因为他们将其嵌入到 HTML 页面中,并且包装器 HTML 使用默认的 ISO-8859-1 编码)。

尝试将邮件发送到其他提供商(例如 Gmail)并检查结果。配置良好的提供程序应该处理主体编码。

解决方案1

如果上述假设成立,则必须在客户端修复错误。他们应该处理主体编码,或者如果它始终是 UTF-8,他们应该简单地将以下标记添加到 HTML 标头中:

<meta http-equiv="content-type" content="text/html; charset=UTF-8">
Run Code Online (Sandbox Code Playgroud)

解决方案2

如果您不能不惜一切代价影响客户端,您可能需要尝试使用其他编码:

mailMessage.BodyEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
Run Code Online (Sandbox Code Playgroud)

请注意,这样您的法语示例将是正确的;但是,非西欧语言将无法正确显示。


小智 1

唯一的方法是用合适的字符替换该字符,因为您正在使用字符映射表并且 html 将您的代码编码为不同的垃圾字符

\n\n

您可以修改您的代码,例如:

\n\n
WebClient myClient = new WebClient();\n\n        byte[] requestHTML;\n        string currentPageUrl = HttpContext.Current.Request.Url.AbsoluteUri;\n        UTF8Encoding utf8 = new UTF8Encoding();\n        requestHTML = myClient.DownloadData(currentPageUrl);\n        var str = utf8.GetString(requestHTML);"\n        str = str.Replace("\xe2\x80\x99", "\'");\n
Run Code Online (Sandbox Code Playgroud)\n