【问题标题】:ä character in MailMessage.Subject showing up as ä in hotmailMailMessage.Subject 中的 ä 字符在 hotmail 中显示为 ä
【发布时间】:2015-09-11 07:46:26
【问题描述】:

问题MailMessage.Subject 中的ä 字符在hotmail 中显示为ä。在 Gmail 中,主题中的 ä 字符看起来不错。您如何正确编码 MailMessage.Subject 以使 ä 字符不会转换为 ä

这就是我创建 MailMessage 的方式(使用 MvcMailer):

public virtual MvcMailMessage OrderConfirmation()
    {
        return Populate(x =>
        {
            x.Subject = "Beställningsbekräftelse";
            x.From = new MailAddress("test@test.com", "test.com");
            x.ViewName = "OrderConfirmation";
            x.To.Add(order.Email);
        });
    }

我尝试了以下方法:

  • x.SubjectEncoding = Encoding.UTF8;
  • x.SubjectEncoding = Encoding.GetEncoding("ISO-8859-1");

【问题讨论】:

    标签: c# .net encoding mvcmailer


    【解决方案1】:

    你试过不转换吗?只是使用你的价值,因为你已经有角色了吗?

    我看到一些遇到同样问题的人报告说他们发现他们的数据已经是 UTF8,因此在您报告时转换它会导致字符混乱。使用它们的字符串值直接解决了这些情况下的显示问题。

    我发现很多人有同样的问题,在不同的上下文中使用关键字:

         ä character converted to ä hotmail
    

    【讨论】:

    • 是的,我试过不转换它 - 它没有解决问题。
    • 完全无赖。其他邮件提供商会发生这种情况吗?除了 Hotmail 吗?
    • 如果可能的话,我建议您测试尽可能多的邮件客户端,以确定正在发生的事情。这也将帮助您搜索有关该问题的更多信息,因为我发现了很多信息,它并不是 hotmail 特有的,而且很难说出什么可能有帮助或可能没有帮助。 =) 例如,Outlook express 可能由于其默认设置而被认为存在编码问题。祝你好运!
    【解决方案2】:

    如果 System.Net.Mail 没有为您正确执行此操作,您可以尝试使用 MimeKitMimeKit.Utils.Rfc2047 实用程序类对标头值进行编码和解码。

    对于ToCcBcc 等中的电子邮件地址的显示名称,您需要使用EncodePhrase,对于Subject 等,您需要使用@987654324 @。

    不幸的是,这些并不是真正设计用于 System.Net.Mail,因为您会注意到它们不返回字符串,它们返回 byte[](这是因为它们被设计为在 MimeKit 内部使用 - 它们仅供高级使用时公开)。

    也就是说,由于从这些方法返回的 byte[] 是 US-ASCII,您可以使用 System.Text.Encoding.ASCII.GetString (result) 将编码的主题转换回您可以在 MailMessage 上设置的字符串。如果您坚持使用 System.Net.Mail,那么这可能是您唯一的选择。如果不是,我强烈建议删除 System.Net.Mail 并将其替换为 MimeKitMailKit(MailKit 可以用于 SMTP、POP3 和/或 IMAP)。

    希望对您有所帮助。

    【讨论】:

    • 给了我同样的结果。这是原始数据在 hotmail 中的样子: 主题:Beställningsbekräftelse 内容类型:text/html; charset=utf-8 内容传输编码:base64
    • 我正在使用 MvcMailer。 MvcMailer 我相信继承自 System.Net.Mail 类。我必须使用 MvcMailer,因为我需要使用它的模板功能。也许一种选择是编写一个继承自 MvcMailerMessage 的新 CustomMvcMailerMessage?并且还编写了一个新的自定义 SMTP 类,使用 MailKit 扩展 MvcMailer SMTP 对象?
    • 如果主题标头看起来像Subject: Beställningsbekräftelse,则说明标头正在解码,Hotmail 出于某种原因无法正确呈现它。 FWIW,它看起来像是使用 iso-8859-1 编码转换为 unicode 显示字符串的 UTF-8。
    【解决方案3】:

    您必须在派生自 MailerBase 的类上覆盖 PopulateHtmlPart

     public override AlternateView PopulateHtmlPart(MailMessage mailMessage, string viewName, string masterName, Dictionary<string, string> linkedResources)
        {
            var htmlPart = base.PopulateHtmlPart(mailMessage, viewName, masterName, linkedResources);
            htmlPart.ContentType.CharSet = mailMessage.BodyEncoding.HeaderName;
            return htmlPart;
        }  
    

    并设置编码

    public virtual MvcMailMessage OrderConfirmation()
        {
            return Populate(x =>
            {
                x.Subject = "Beställningsbekräftelse";
                x.From = new MailAddress("test@test.com", "test.com");
                x.ViewName = "OrderConfirmation";
                x.To.Add(order.Email);
                x.BodyEncoding = Encoding.UTF8;
                x.SubjectEncoding = Encoding.UTF8;
            });
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      相关资源
      最近更新 更多