最近在项目中做找回密码时用到SmtpClient方式发送邮件给用户,程序调试都通过了,在运行中报"在邮件标头中找到无效的字符”"错误。在网上看到有人说如果服务器的名字中有中文就会报这个错误,于是把我的机器上中文命名的名字改成了英文,再运行程序就没有报错了。
System.Net.Mail.SmtpClient是.Net2.0自带的smtp邮件类,相信很多人在用SmtpClient的时候会遇到过“System.FormatException: 在邮件标头中找到无效的字符”这个异常。这个异常很多情况下都会发生,从提示信息看是邮件地址、标题等不符合规范造成的,但我碰到的情况却是SmtpClient的一个bug:如果计算机名中含有中文的话,使用SmtpClient发送邮件就会抛这个异常。
原因是SmtpClient使用了计算机名作为smtp协议中HELO命令的参数,而在发送命令时又会对字符进行检查,若是非法字符则会抛出异常,很不幸中文字符都包括在内。这算不算是歧视中国人民呢?囧
如果在确保邮件格式正确的情况下还抛“在邮件标头中找到无效的字符”异常,或者在一台电脑上正常另一台机子上却抛该异常的话,检查下计算机名是否是中文的。希望能帮遇到同样问题的人少绕些圈子。
Debug了一上午,老是报 在邮件标头中找到无效的字符 这个错误,无论用英文还是中文,都有错误。百度上也都说什么编码错误。感觉不对,还是Google强悍,找到了相关信息,原来这个是System.Net .Mail.Message 类的一个错误。找到了一篇文章,是安德鲁的,由于原为繁体中文,现改成简体中文,放到下面。微软的官方网站,也报出了解决方案,不过还是用System.Web.Mail 发邮件比较实在点。
参考地址:http://www.cnblogs.com/pig_wang/archive/2010/04/26/1720900.html