关于.Net中的”在邮件标头中找到无效字符”的Bug
我是碰到第三种情况,计算机名为中文时,会出现发送邮件错误
public static void CreateTestMessage1(string server)
{
MailAddress from = new MailAddress(“******@***.com”,”发件人呢称”,Encoding.UTF8);
MailAddress to = new MailAddress(“*******@***.com”,”收件人呢称”,Encoding.UTF8 );
MailMessage message = new MailMessage(from, to);
message.Subject = “这是标题”;
message.Body = “这是正文”;
//Console.Write(“{0}”, message.From.ToString());
SmtpClient client = new SmtpClient(server);
//SMTP验证
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential(“验证用户名”, “密码”);
client.Send(message);
}
百度查了有三种说法:
第一种,是在 SmtpClient.Send 之前曾经调用过该 MailMessage 对象的 From, To, Cc 等字段的 ToString 方法。很有可能的情形是,你尝试在发信前留下日志时,“无意间”调用到了。而微软的工程师在此处出现了一些失误,最终产生了该错误消息,具体情况请参看链接中的文章。
http://columns.chicken-house.net/blogs/chicken/archive/2007/04/06/system-net-mail-bug.aspx
第二种,微软知识库里给出的一种原因是因为收件人显示名称中包含有引号。
第三种,你的计算机机名称中有汉字。原因是SmtpClient使用了计算机名作为smtp协议中HELO命令的参数,而在发送命令时又会对字符进行检查,若是非法字符则会抛出异常,很不幸中文字符都包括在内。
根据本人亲自试验,证实第三种说法是正确的,将计算机名称改成非汉字就可以正确发送了。可能在别的运行环境中有些不同。我的环境是:WinXP+SP3,.net3.5。要做这方面的软件的话,有这个Bug还真是不好用,总不能要别人改计算机名吧。