问题是,不添加附件发送正常,添加附件发送就报错:+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;
}
}
}
}
源代码如下:
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;
}
}
}
}
SC.EnableSsl = isSSL;
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";
disposition.ModificationDate = System.IO.File.GetLastWriteTime(file[i]);//获取附件的修改日期
disposition.ReadDate = System.IO.File.GetLastAccessTime(file[i]);//获取附件的读取日期
这几行代码去掉就可以了
首先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协议。我看了下这个设置是正确的。
最终原因只能是在解析的时候出现了无法识别中文的内容。