簡體   English   中英

在電子郵件中編碼為 UTF-8

[英]encoding to UTF-8 in email

我有一個客戶收到的電子郵件編碼不正確。 我正在使用 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 message envoyés à l'aide des caractères français。 Merci et bonne journée。

他們看到: *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;
    }

最終解決了我的問題的是在備用視圖上設置內容類型。 盡管 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);

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

解決方案2

如果您不能以任何代價影響客戶端,您可能想嘗試使用另一種編碼:

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

請注意,您的程序會以這種方式正確; 但是,非西歐語言將無法正確顯示。

唯一的方法是用合適的字符替換字符,因為您正在使用字符映射並且 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("’", "'");

嘗試:

mailMessage.BodyEncoding = UTF8Encoding.UTF8;

代替:

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

我在郵件中的口音也有類似的問題。 我的解決方案是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM