encoding to UTF-8 in email

31,971

Solution 1

What finally solved my problem was setting the contenttype on the alternate view. Just setting the msg.BodyEncoding didn't work in (among others) Outlook although Gmail displayed the email correctly.

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

Solution 2

Your example clearly shows that the text you send has UTF-8 encoding, which is interpreted as Windows-1252 or ISO-8859-1 encoding (see the results of several encoding errors, especially the last row in the table here).

So your code seems to be alright, the problem might be that client side just ignores the encoding of the mail body (for example because they embed it into an HTML page and the wrapper HTML uses the default ISO-8859-1 encoding).

Try to send the mail to another provider (eg. Gmail) and check the results. Well configured providers should handle the body encoding.

Solution 1

If the assumptions above are true the error must be fixed on client side. They should either process the body encoding or if it is always UTF-8, they should simply add the following tag into HTML header:

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

Solution 2

If you cannot affect the client side at any cost you might want to try to use another encoding:

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

Please note that your French example will be correct this way; however, non-Western European languages will not be displayed correctly.

Solution 3

The only way is to replace the character with suitable character as you are using character map and the html is encoding your code to different garbage character

you can modify your code like :

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("’", "'");

Solution 4

Try:

mailMessage.BodyEncoding = UTF8Encoding.UTF8;

instead of:

mailMessage.BodyEncoding = System.Text.Encoding.UTF8;
Share:
31,971
Rob Allen
Author by

Rob Allen

Oh hello there. I'm a lead engineer at Mondo Robot currently making cool stuff.

Updated on December 17, 2020

Comments

  • Rob Allen
    Rob Allen over 3 years

    I have a client that is receiving email incorrectly encoded. I am using the System.Net.Mail class and setting the body encoding to UTF-8. I have done a bit of reading and since I have to set the body of the email as a string encoding the data to a UTF-8 byte array really does nothing for me since I have to convert is back to a string that is UTF-16. Correct?

    when I send: 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.

    They see: *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.*

    I have tried different encodings on the email, but I am really suspecting that the client is incorrectly decoding the email since my email client displays this correctly. Am I missing something? Is there something else that can be done?

    code below

    SmtpMailService.SendMail(string.Empty, toAddress, "[email protected]", "", 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;
        }
    
    • I4V
      I4V about 11 years
      Am I missing something? maybe showing your code?
    • Rob Allen
      Rob Allen about 11 years
      there really isn't any code to show, it is more of an abstract question but I'll add it anyways
    • Brian Dishaw
      Brian Dishaw about 11 years
      Is body a UTF8 encoded string when it's passed into this method?
    • Rob Allen
      Rob Allen about 11 years
      It is my understanding, and I quote "A string in C# is always UTF-16, there is no way to "convert" it."
    • Wiktor Zychla
      Wiktor Zychla about 11 years
      @RobA: it is. Beside setting your body and subject encoding to utf-8 you can't do much. If I were you I would ask your client to change their email software.
    • Simon Mourier
      Simon Mourier over 7 years
      utf-8 is what MailMessage uses if you don't specify an encoding anyway. referencesource.microsoft.com/#System/net/System/Net/mail/… I assume you are using System.Net.Mail.MailMessage and not System.Web.Mail.MailMessage. Otherwise, there are good chances that the email client is broken. If you test it with a normal client (hotmail, outlook, anything) successfully, than it's 99% chance you've done everything possible on your side.
    • Laurent Lequenne
      Laurent Lequenne over 7 years
      What is the source of your body ? if it's a text file, make sure that the file is encoded as UTF-8
  • edosoft
    edosoft over 7 years
    The problem doesn't occur in Gmail, but it does in Outlook.
  • György Kőszeg
    György Kőszeg over 7 years
    In Outlook open the mail and click Actions/Other Actions/Encoding. What is selected? If Western European, switch to UTF-8. If always the wrong settings are auto detected check the source under Actions/Other Actions/View Source. Here you should see the HTML or plain text body. Is charset or lang defined anywhere?
  • SalientBrain
    SalientBrain over 7 years
    note: MailMessage class removes this META tag from the mail bod. So we need to use the following: mail.Headers.Add("Content-Type", "content=text/html; charset=\"UTF-8\"");
  • sucil
    sucil over 6 years
    you can also directly set the charset while creating a new ContentType: new ContentType("text/html; charset=UTF8");
  • keinz
    keinz about 4 years
    tried to add this on my code that was reading everything in windows-1252 and all of my body message went blank.