.net 发送邮件 头值中找到无效字符

本文介绍了在使用.NET的System.Net.Mail发送邮件时遇到的'An invalid character was found in header value.'异常。问题源于编码问题,特别是当涉及到MailMessage对象的From, To, Cc等字段时。通过使用Encoding.BigEndianUnicode解决了这个问题,但可能导致中文乱码。解决方案包括在Body和Subject属性设置时添加ToString()方法。" 109447166,10168414,理解状态模式与有限状态机,"['设计模式', '状态管理', '软件设计', '编程模式']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值