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

C# 在电子邮件中编码为UTF-8,c#,.net,email,encoding,utf-8,C#,.net,Email,Encoding,Utf 8,我有一个客户收到的电子邮件编码不正确。我正在使用System.Net.Mail类并将正文编码设置为UTF-8。我做了一些阅读,因为我必须将电子邮件正文设置为一个字符串,将数据编码为UTF-8字节数组,这对我来说真的没有任何帮助,因为我必须将其转换回UTF-16字符串。对吗 当我发送时: 最后一条消息是,法国外交使节将对该系统发表评论。 谢谢你,祝你好运 他们看到: *这是一封信,信的结尾是对系统的评论,信的使者是法国的助手 谢天谢地,祝你好运* 我在电子邮件上尝试了不同的编码,但我真的怀疑客户没

我有一个客户收到的电子邮件编码不正确。我正在使用System.Net.Mail类并将正文编码设置为UTF-8。我做了一些阅读,因为我必须将电子邮件正文设置为一个字符串,将数据编码为UTF-8字节数组,这对我来说真的没有任何帮助,因为我必须将其转换回UTF-16字符串。对吗

当我发送时: 最后一条消息是,法国外交使节将对该系统发表评论。 谢谢你,祝你好运

他们看到: *这是一封信,信的结尾是对系统的评论,信的使者是法国的助手

谢天谢地,祝你好运*

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

代码如下

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;
    }

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

您可以修改代码,如:

WebClient myClient = new WebClient();

        byte[] requestHTML;
        string currentPageUrl = HttpContext.Current.Request.Url.AbsoluteUri;
        UTF8Encoding utf8 = new UTF8Encoding();
        requestHTML = myClient.DownloadData(currentPageUrl);
        var str = utf8.GetString(requestHTML);"
        str = str.Replace("’", "'");

您的示例清楚地表明,您发送的文本具有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">

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

最终解决我的问题的是在备用视图上设置contenttype。仅仅设置msg.BodyEncoding在Outlook中不起作用,尽管Gmail正确显示了电子邮件

    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);
尝试:

而不是:

mailMessage.BodyEncoding = System.Text.Encoding.UTF8;

我在邮件中的口音方面也有类似的问题。我的解决办法是:

mail.BodyEncoding = System.Text.Encoding.UTF8;

我遗漏了什么吗?
可能会显示你的代码吗?实际上没有任何代码可以显示,这更像是一个抽象的问题,但我还是要添加它。
body
一个UTF8编码的字符串,当它被传递到这个方法中时?这是我的理解,我引用“C中的字符串总是UTF-16,没有办法“转换”它。”@罗巴:是的。除了将您的身体和主题编码设置为utf-8之外,您不能做太多。如果我是你,我会要求你的客户更改他们的电子邮件软件。问题在Gmail中不会出现,但在Outlook中会出现。在Outlook中打开邮件,然后单击“操作/其他操作/编码”。选择什么?如果是西欧,则切换到UTF-8。如果总是自动检测到错误设置,请在“操作/其他操作/查看源”下检查源。这里您应该看到HTML或纯文本正文。是否在任何地方定义了字符集或lang?注意:MailMessage类从邮件bod中删除此元标记。因此我们需要使用以下内容:mail.Headers.Add(“内容类型”,“内容=文本/html;字符集=\“UTF-8\”);您还可以在创建新ContentType时直接设置字符集:new ContentType(“text/html;charset=UTF8”);试图将此添加到我在windows-1252中读取所有内容的代码中,我的所有正文消息都变为空白。
mailMessage.BodyEncoding = System.Text.Encoding.UTF8;
mail.BodyEncoding = System.Text.Encoding.UTF8;