利用System.Net.Mail写发送邮件的功能
其实代码比较简单
但是总碰到如下症状:
症状是:调用 SmtpClient.Send 方法后,出现 System.FormatException,
英文消息为“An invalid character was found in header value.”
中文消息是:“邮件标头中找到无效字符”。
经查阅很多资料,发现
原因是在 SmtpClient.Send 之前曾经调用过该 MailMessage 对象的 From, To, Cc 等字段的 ToString 方法。很有可能的情形是,你尝试在发信前留下日志时,“无意间”调用到了。而微软的工程师在此处出现了一些失误,最终产生了该错误消息,具体情况请参看上 面链接中的文章。
P.S. 当然还会有其他原因可能导致此问题,比如微软知识库里给出的一种原因是因为收件人显示名称中包含有引号。
是编码问题了.试了很多 最终在网上查到使用Encoding chtEnc = Encoding.BigEndianUnicode;可以解决
也查到一些使用其他的。可能是看自己的需求选择编码方式了。
private void btnSend_Click(object sender, EventArgs e)
{
XmlDocument xmlDoc = new XmlDocument();
Encoding chtEnc = Encoding.BigEndianUnicode;
MailMessage mail = new MailMessage();
string toAddress = tbxMailTo.Text.ToString();
//设置邮件的发件人
//Pass:如果不想显示自己的邮箱地址,这里可以填符合mail格式的任意名称,真正发mail的用户不在这里设定,这个仅仅只做显示用
mail.From=new MailAddress("", "小事一箩筐",chtEnc);
mail.To.Add(new MailAddress(toAddress, "企业", chtEnc));
//mail.CC.Add(new MailAddress("", "尊敬的网友"));
mail.Subject = tbxMailSubject.Text;
mail.SubjectEncoding = chtEnc;
mail.Body = "谢谢您在百忙之中查阅!/r/n祝:身体健康!";
mail.BodyEncoding = System.Text.Encoding.UTF8;
mail.IsBodyHtml = true;
//设置邮件的发送级别
mail.Priority = MailPriority.Normal;
mail.Attachments.Add(new Attachment(filePath));
mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;
SmtpClient client = new SmtpClient();
//设置用于 SMTP 事务的主机的名称,填IP地址也可以了
client.Host = "smtp.gmail.com";
//设置用于 SMTP 事务的端口,默认的是 25
//client.Port = 25;
client.UseDefaultCredentials = false;
//这里才是真正的邮箱登陆名和密码,比如我的邮箱地址是 xiaoshiyiluokuang@yahoo.cn, 我的用户名为 xiaoshiyiluokuang,我的密码是 password
client.Credentials = new System.Net.NetworkCredential("xiaoshiyiluokuang", "password");
client.DeliveryMethod = SmtpDeliveryMethod.Network;
//都定义完了,正式发送
try
{
client.EnableSsl = true;
client.Send(mail);
MessageBox.Show("邮件已发出,请确认!", "提示");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "异常");
}
}
不过这样我测试的时候问题是没有了,貌似中文有乱码。另外我又查找了一下相关资料,下面的比较靠谱一些:
http://makoma.blog.hexun.com/16453328_d.html
M$ 工程师为了避开重复作编码的动作,
每次呼叫 ToEncodedString( ) 及 ToString( ) 时都会去看看 fullAddress 这个 private
field 是否有值? 有的话代表之前已经作过编码了, 就直接捡现成. 问题出在第一次呼叫时, 编码的动作在 ToString( ) 及
ToEncodedString( ) 各写了一次 (果然没有做好 refactoring ... 哈哈), 结果 ToString( ) 的这份
code implementation 是错的, 跟本没编码 ...
在我的程序中原来是这样的:
this.Body = mailbody
this.Subject = rule.RuleName
加入.toString()后,问题解决!
this.Body = mailbody.ToString();
this.Subject = rule.RuleName.ToString();
主要问题是this.Subject出了问题
我按照这位网友的说法,就是在body,和subject调用的时候都加上ToString(),就成功的解决问题,希望我的文章对有同样问题的朋友有所帮助。另外希望大家支持我的网站,小事一箩筐,http://www.xiaoshiyiluokuang.com