使用System.Net.Mail.MailMessage发送的电子邮件中的编码不正确

时间:2015-05-04 13:40:10

标签: c# asp.net email

当收到与System.Net.Mail.MailMessage一起发送的电子邮件时,某些收件人似乎对电子邮件存在编码问题。例如,charachter ä显示为Ã。我已经设置了编码属性:

System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
...
msg.BodyEncoding = System.Text.Encoding.UTF8;
msg.SubjectEncoding = System.Text.Encoding.UTF8;

我还能做什么?

更新

如果我使用Body属性,电子邮件会正确显示,但当我使用AlternateViews属性时,电子邮件显示不正确。

完整代码:

SmtpClient smtpClient = new SmtpClient("some.host.com");
MailMessage msg = new MailMessage();
msg.To.Add("someone@host.com");
msg.From = new MailAddress("name@host.com", "Name Name");
msg.Subject = "Test";

//Displays as ä
//msg.Body = "ä";

// Displays as ä
AlternateView htmlView = AlternateView.CreateAlternateViewFromString("ä", new ContentType(MediaTypeNames.Text.Html));
msg.AlternateViews.Add(htmlView);

smtpClient.Send(msg);

发送到Gmail时,电子邮件会正确显示,但在发送到Exchange服务器时,电子邮件显示不正确。我已经在.NET 3.5和4.5中进行了测试。

2 个答案:

答案 0 :(得分:9)

尝试将内容类型添加到备用视图:

AlternateView htmlView = AlternateView.CreateAlternateViewFromString("ä", new ContentType(MediaTypeNames.Text.Html));
htmlView.ContentType.CharSet = Encoding.UTF8.WebName;

答案 1 :(得分:1)

我认为BodyEncoding和SubjectEncoding不会以任何方式影响消息的读取 - 它适用于发送消息时,并在发送消息时设置消息和标题的文本编码。

SmtpClient将从发送的消息中读取内容类型和字符集编码,并根据在标题中找到的编码对消息和主题进行解码。

如果你的消息没有被解码,似乎消息可能没有被正确编码(或者可能是双重编码的UTF-8编码的字符串被消息编码器再次编码),消息上的请求标题不正确匹配消息的实际编码或使用.NET中不支持的字符集格式。

唯一可以知道的方法是查看无法查看实际发送内容的消息的实际原始请求跟踪。

您可能希望为电子邮件设置System.NET跟踪(请参阅http://codepaste.net/j52ktp),或者使用Wireshark之​​类的内容监控TCP / IP流,以查看实际通过网络传输的内容以及标头指示的内容客户端处理数据。

FWIW,没有理由为SmtpClient对消息进行正确的UTF-8编码,以便不能正确读取这些消息。