问题是,不添加附件发送正常,添加附件发送就报错:+InnerException {"在邮件标头中找到无效的字符:“周”。"} System.Exception {System.FormatException}
源代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net.Mime;
using System.Net;namespace PutSale
{
    /// <summary>
    /// 描述:邮件操作类
    /// 作者:slickly
    /// 日期:2009-7-31
    /// </summary>
    public class MailHelper
    {
        #region 数据成员
        protected int emailPriority = 1;          //邮件紧急程度
        protected string mailFormat = "text";     //邮件类型
        protected string fromMail = "发件人邮箱"; //发件人邮箱地址
        protected string toMail;                  //收件人地址
        protected string subject;                 //邮件主题
        protected string body;                    //邮件内容
        //protected Encoding mailEncoding = Encoding.GetEncoding(936);      //邮件编码
        protected Encoding mailEncoding=Encoding.BigEndianUnicode;
        //Encoding chtEnc = Encoding.BigEndianUnicode
        protected int isLocalSmtp = 2;            //是否启用本地smtp服务器
        protected string smtpServer = "邮箱smtp服务器";// 远程stmp服务器名称
        protected int smtpPort = 25; // 远程stmp服务器端口  
        protected int isSmtpAuthenticate = 1;     //是否需要验证
        protected bool isSSL = false;              //是否需要SSL认证
        protected string mailUserName = "用户名"; //用户名
        protected string mailPassWord = "密码";   //密码
        protected string attachments = "";
        #endregion        #region 属性
        /// <summary>
        /// 构造函数重载
        /// </summary>
        /// <param name="to">收件人地址</param>
        /// <param name="from">发件人地址</param>
        /// <param name="subject">邮件标题</param>
        /// <param name="body">邮件正文</param>
        /// <param name="host">发送邮件服务器名或地址</param>
        /// <param name="userName">发件人用户名</param>
        /// <param name="password">发件人密码</param>
        /// 
        /// <summary>
        /// 邮件紧急程度,0为低,1为普通,2为高
        /// </summary>
        public int EmailPriority
        {
            get { return emailPriority; }
            set { emailPriority = value; }
        }        /// <summary>
        /// 邮件类型 text为纯文本型,html为Html编码型
        /// </summary>
        public string MailFormat
        {
            get { return mailFormat; }
            set { mailFormat = value; }
        }
        /// <summary>
        /// 发件人邮箱地址
        /// </summary>
        public string FromMail
        {
            get { return fromMail; }
            set { fromMail = value; }
        }
        /// <summary>
        /// 收件人地址
        /// </summary>
        public string ToMail
        {
            get { return toMail; }
            set { toMail = value; }
        }
        /// <summary>
        /// 邮件主题
        /// </summary>
        public string Subject
        {
            get { return subject; }
            set { subject = value; }
        }        /// <summary>
        /// 邮件内容
        /// </summary>
        public string Body
        {
            get { return body; }
            set { body = value; }
        }        /// <summary>
        /// 邮件编码格式
        /// </summary>
        public Encoding MailEncoding
        {
            get { return mailEncoding; }
            set { mailEncoding = value; }
        }        /// <summary>
        /// 邮件附件 - 输入附件路径
        /// </summary>
        public string Attachments
        {
            get
            {
                return attachments;
            }
            set
            {
                attachments = value;
            }
        }        /// <summary>
        /// 是否启用本地smtp服务器,1为启用本地,2为启用远程smtp,默认为2
        /// </summary>
        public int IsLocalSmtp
        {
            get { return isLocalSmtp; }
            set { isLocalSmtp = value; }
        }        /// <summary>
        /// 远程stmp服务器名称
        /// </summary>
        public string SmtpServer
        {
            get { return smtpServer; }
            set { smtpServer = value; }
        }        /// <summary>
        /// 远程stmp服务器端口号
        /// </summary>
        public int SmtpPort
        {
            get { return smtpPort; }
            set { smtpPort = value; }
        }        /// <summary>
        /// 是否需要验证  0为不验证,1为BASIC验证,2为NTLM验证方式
        /// </summary>
        public int IsSmtpAuthenticate
        {
            get { return isSmtpAuthenticate; }
            set { isSmtpAuthenticate = value; }
        }        /// <summary>
        /// 是否需要SSL认证
        /// </summary>
        public bool IsSSL
        {
            get { return isSSL; }
            set { isSSL = value; }
        }        /// <summary>
        /// 邮箱用户名
        /// </summary>
        public string MailUserName
        {
            get { return mailUserName; }
            set { mailUserName = value; }
        }        /// <summary>
        /// 邮箱密码
        /// </summary>        public string MailPassWord
        {
            get { return mailPassWord; }
            set { mailPassWord = value; }
        }        #endregion
        public string SendEmail()
        {
            try
            {
                MailMessage msg = new MailMessage(fromMail, toMail, subject, body);                msg.BodyEncoding = mailEncoding;
                msg.SubjectEncoding = mailEncoding;                //是否启用html
                switch (mailFormat)
                {
                    case "html":
                        msg.IsBodyHtml = true;
                        break;
                    case "text":
                        msg.IsBodyHtml = false;
                        break;
                    default:
                        msg.IsBodyHtml = true;
                        break;
                }                switch (emailPriority)
                {
                    case 2:
                        msg.Priority = MailPriority.High;
                        break;
                    case 1:
                        msg.Priority = MailPriority.Normal;
                        break;
                    case 0:
                        msg.Priority = MailPriority.Low;
                        break;
                }
                //使用简单邮件传输协议来传送邮件//发送邮件的服务器名或地址
                SmtpClient SC = new SmtpClient(smtpServer, smtpPort);
                SC.UseDefaultCredentials = true;
                //验证发件人的身份
                SC.Credentials = new NetworkCredential(mailUserName, mailPassWord);
                //处理待发送邮件的方法
                SC.DeliveryMethod = SmtpDeliveryMethod.Network;                if (attachments.Length > 3)
                {
                    string[] file = attachments.Split(new char[2] { ',', ';' });
                    Attachment data;
                    ContentDisposition disposition;
                    for (int i = 0; i < file.Length; i++)
                    {
                        //附件对象
                        data = new Attachment(file[i], MediaTypeNames.Application.Octet);//实例化附件  
                        //附件资料
                        disposition = data.ContentDisposition;
                        if (System.IO.File.Exists(file[i]))
                        {
                            disposition.CreationDate = System.IO.File.GetCreationTime(file[i]);//获取附件的创建日期  
                            disposition.ModificationDate = System.IO.File.GetLastWriteTime(file[i]);//获取附件的修改日期  
                            disposition.ReadDate = System.IO.File.GetLastAccessTime(file[i]);//获取附件的读取日期  
                            msg.Attachments.Add(data);//添加到附件中  
                        }
                    }
                }                  SC.EnableSsl = isSSL;
                //发送邮件
                SC.Send(msg);
                return "邮件发送成功!";            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
    }
}

解决方案 »

  1.   

    网上说的计算机名称不能用中文,我的计算机名称是“HPC”全英文。哪位大虾救救我啊。
      

  2.   

    就上面來看,你的toMail是沒有賦值的,不知你實際調用時有沒有賦值還有isSSL中設置false試下
    SC.EnableSsl = isSSL;
      

  3.   

    忘了讲了,我是这样调用的:MailHelper mh = new MailHelper();
                mh.ToMail = "收件人地址";
                mh.Subject = "转发: 退货供应商";
                mh.Body = "附件是各位回复的处理意见,并未给出具体处理方式。";
                mh.Attachments = @"E:\六脉神剑.txt";
                Console.WriteLine(mh.SendEmail());
                //Console.WriteLine("Send mail success.");
                Console.Write("按任意键退出...");
                Console.ReadKey();下面这行去掉可以发送成功,但是加上发送不报错,但是提示发送失败了。
    mh.Attachments = @"E:\六脉神剑.txt";
      

  4.   

    disposition.CreationDate = System.IO.File.GetCreationTime(file[i]);//获取附件的创建日期   
      disposition.ModificationDate = System.IO.File.GetLastWriteTime(file[i]);//获取附件的修改日期   
      disposition.ReadDate = System.IO.File.GetLastAccessTime(file[i]);//获取附件的读取日期   
    这几行代码去掉就可以了
      

  5.   

    这个问题我也遇到过,所以分析了下,但是解析的部分没时间看,先看下这个错误值是怎么来的。
    首先ContentDisposition的三个属性
    public DateTime CreationDate { get; set; }public DateTime ModificationDate { get; set; }public DateTime ReadDate { get; set; }
    这三个属性在Set时,会实例化一个System.Net.Mime.SmtpDateTime的对象。这个对象是internal的,是不可见的。实例化后,会自动将这个对象赋值到ContentDisposition实例的Parameters中(内部变量),这个变量是StringDictionary类型。问题是,在赋值的时候执行了一个SmtpDateTime.ToString()的处理,我看了下,这个处理是按照Smtp协议中关于Content-Disposition定义(RFC 2183)的规范来赋值的,是个日期的格式规范(参考RFC 822)。public override string ToString()
    {
        if (this.unknownTimeZone)
        {
            return string.Format("{0} {1}", this.FormatDate(this.date), "-0000");
        }
        return string.Format("{0} {1}", this.FormatDate(this.date), this.TimeSpanToOffset(this.timeZone));
    }
    internal string FormatDate(DateTime value)
    {
        return value.ToString("ddd, dd MMM yyyy H:mm:ss");  // 这个才是关键。直接把“星期”输出到最前面了。(在发生异常过的时候显示的是“周”,其实就是周一、周二的星期)
    }至于解析的部分太过里面,我没跟踪进去,但是“ddd, dd MMM yyyy H:mm:ss”这个在MSDN上微软指出是RFC 1123协议。我看了下这个设置是正确的。
    最终原因只能是在解析的时候出现了无法识别中文的内容。