【问题标题】:encoding to UTF-8 in email在电子邮件中编码为 UTF-8
【发布时间】:2013-04-21 18:03:12
【问题描述】:

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

当我发送时: Il s'agit d'un message de test pour déterminer comment le système va gérer les messages envoyés à l'aide des caractères français。 祝你好运。

他们看到: *Il s'agit d'un message de test pour déterminer comment le système va gérer les messages envoyés à l'aide des caractères français.

Merci et bonne journé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;
    }

【问题讨论】:

  • Am I missing something? 可能会显示您的代码?
  • 确实没有任何代码可以显示,这是一个抽象的问题,但我还是会添加它
  • body 传入此方法时是 UTF8 编码的字符串吗?
  • 这是我的理解,我引用“C#中的字符串总是UTF-16,没有办法“转换”它。”
  • @RobA:是的。除了将您的正文和主题编码设置为 utf-8 之外,您无能为力。如果我是你,我会要求你的客户更改他们的电子邮件软件。

标签: c# .net email encoding utf-8


【解决方案1】:

我在邮件中遇到了类似的口音问题。我的解决方案是:

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

【讨论】:

  • 试图将其添加到我正在读取 windows-1252 中所有内容的代码中,并且我的所有正文消息都变为空白。
【解决方案2】:

试试:

mailMessage.BodyEncoding = UTF8Encoding.UTF8;

代替:

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

【讨论】:

    【解决方案3】:

    最终解决我的问题是在备用视图上设置内容类型。尽管 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);
    

    【讨论】:

    • 也可以在新建ContentType时直接设置charset:new ContentType("text/html; charset=UTF8");
    【解决方案4】:

    您的示例清楚地表明您发送的文本具有 UTF-8 编码,该编码被解释为 Windows-1252 或 ISO-8859-1 编码(查看几个编码错误的结果,尤其是表格中的最后一行 @987654321 @)。

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

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

    解决方案 1

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

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    

    解决方案 2

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

    mailMessage.BodyEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1");
    

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

    【讨论】:

    • 该问题在 Gmail 中不会出现,但在 Outlook 中会出现。
    • 在 Outlook 中打开邮件并单击操作/其他操作/编码。选择了什么?如果是西欧,请切换到 UTF-8。如果总是自动检测到错误的设置,请检查操作/其他操作/查看源下的源。在这里,您应该看到 HTML 或纯文本正文。 charset 或 lang 是否在任何地方定义?
    • 注意:MailMessage 类从邮件正文中删除此 META 标记。所以我们需要使用以下内容:mail.Headers.Add("Content-Type", "content=text/html; charset=\"UTF-8\"");
    【解决方案5】:

    唯一的方法是在您使用字符映射时将字符替换为合适的字符,并且 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("’", "'");
    

    【讨论】:

      猜你喜欢
      • 2020-08-07
      • 1970-01-01
      • 2011-11-26
      • 2012-12-26
      • 2013-06-08
      • 2011-12-31
      • 2023-03-21
      • 1970-01-01
      • 2020-11-21
      相关资源
      最近更新 更多