Subject encoding on SmtpClient/MailMessage

放肆的年华 提交于 2019-12-05 05:15:10

This was confirmed as a bug in the MSDN forums:
http://social.msdn.microsoft.com/Forums/vstudio/en-US/4d1c1752-70ba-420a-9510-8fb4aa6da046/subject-encoding-on-smtpclientmailmessage

And a bug was filed on Microsoft Connect: https://connect.microsoft.com/VisualStudio/feedback/details/785710/mailmessage-subject-incorrectly-encoded-in-utf-8-base64

One work-around is to set the SubjectEncoding of the MailMessage to an other encoding, such as ISO-8859-1. In this case, the subject will be encoded in Quoted Printable (not Base64) which avoids the problem.

A better solution is to use Encoding.Unicode instead of Encoding.UTF8 for the SubjectEncoding.

It appears that, as the Microsoft implementation simply ignores the reality of UTF-16 being able to encode characters in more than two bytes (as seen on Why does C# use UTF-16 for strings?), the stable character size helps.

I've seen this used on https://gist.github.com/dbykadorov/9047455.

My solution to this problem is some kind of trick!

I use Persian language in mail subject and I send my mail using SmtpClient in .Net framework 4.5.2. the received message subject shows some garbage words at certain positions e.g 18th and 38th character in subject string. whatever the subject is.

Then I tried inserting some spaces (character 32) in these positions and after re-sending mail the result was very good. the unicode subject was showing as expected.

so I wrote a function to insert 6 spaces in my required positions (avoiding inserting spaces within words) like this :

private static string InsertSpacesBetweenWords(this string subject , int where)
    {
        int l;
        int i=1;
        string[] s = subject.Split(new string[] { " " },  StringSplitOptions.RemoveEmptyEntries);
        string output = "";

        if (s.Length > 0) output += s[0] + " ";
        l = output.Length;
        bool done = false;

        while (i < s.Length)
        {
            if (!done)
            {
                if ((s[i] + output).Length > where)
                {
                    for (int j = output.Length; j < where + 6; j++)
                        output += " ";
                    done = true;
                }
            }
            output += s[i] + " ";
            i++;
        }
        return output;
    }

then I converted mail subject using this function :

mail.Subject = mySubject.InsertSpacesBetweenWords(38).InsertSpacesBetweenWords(18);

The interesting point is that Gmail and Yahoo mail (and possibly other web based mail systems) ignore the extra spaces and show subject as expected.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!