最近做的一个项目中使用到了发送邮件功能。跟以前做过的一个项目发送邮件的方式不同。以前是将要发送邮件的相关信息插入到一个服务器的数据库表中,由数据库来检测新添加记录,进行发送邮件。即我只要向某个数据库插入记录就可以了。这次发送邮件功能是使用微软System.Net.Mail命名空间下的SmtpClient来发送。使用过程中注意引用System.Net.Mail命名空间。
过程如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
/// 发送邮件
/// </summary>
/// <param name="server"> smtp服务器 </param>
/// <param name="sender"> 发件人 </param>
/// <param name="recipient"> 收件人 </param>
/// <param name="subject"> 主题 </param>
/// <param name="body"> 主体内容 </param>
/// <param name="isBodyHtml"> 主体内容是否是HTML </param>
/// <param name="encoding"> 编码方式 </param>
/// <param name="isAuthentication"> 是否验证 </param>
/// <param name="files"> 附件 </param>
public static void Send( string server, string sender, string [] recipient, string subject,
string body, bool isBodyHtml, Encoding encoding, bool isAuthentication, params string [] files)
{
// smtp服务器
SmtpClient smtpClient = new SmtpClient(server);
// 邮件信息
MailMessage message = new MailMessage();
// 客户端用户名验证与此处发件人要相同
message.From = new MailAddress(sender);
// 收件人
foreach ( string to in recipient)
{
message.To.Add(to);
}
// 主体内容是否HTML
message.IsBodyHtml = isBodyHtml;
// 编码方式
message.SubjectEncoding = encoding;
message.BodyEncoding = encoding;
// 主题
message.Subject = subject;
// 主体内容
message.Body = body;
// 附件
message.Attachments.Clear();
if (files != null && files.Length != 0 )
{
for ( int i = 0 ; i < files.Length; ++ i)
{
Attachment attach = new Attachment(files[i]);
message.Attachments.Add(attach);
}
}
if (isAuthentication == true )
{
// 用户名凭证
smtpClient.Credentials = new NetworkCredential(ConfigHelper.GetConfigString( " userid " ), ConfigHelper.GetConfigString( " password " ));
}
// 发送方式:网络方式
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
// 客户端发送邮件
smtpClient.Send(message);
}
方法大概是这样的。有几点需要作一下说明:
1.公用邮箱的身份验证。很多公用邮箱为了反垃圾邮件,都加强了用户发邮件的限制。需要用户名密码进行安全验证。即我这里的
ConfigHelper.GetConfigString("userid")和ConfigHelper.GetConfigString("password")是其他类库的方法,其中userid和password是在web.config中设置的。message.From要与配置的userid相同。即某个身份通过验证后,以它的身份发送。否则会出错。还有一点,发送方式一般设置成Network就可以了。
2.发送频率问题。我所要实现的内网(公司使用foxmail邮箱)之间发送邮件,如果邮件大量瞬时发送,即1秒钟发送好几封邮件这样的频率。发送是不成功的。邮件服务商和公司都通不过。容易被邮件服务商当作垃圾邮件也处理掉了,同时公司也通不过,公司内部之间发送foxmai邮件时是一进一出的过程,占用大量的宽带资源。(我直接通过公司foxmail邮箱向我的163邮箱发送邮件,对发送频率没有做限制,发送成功。结果一下子发送了几千封邮件,把我163的邮箱都挤爆了。)所以最好设置成好几秒钟发送一封。我通过设置System.Threading.Thread.Sleep(5000),使每5秒钟发送一封邮件是OK的。
3.注意放火墙和杀毒软件。这一点我没有太关注,别人有提到过。要注意给这些软件加上规则,以防止它们阻止邮件的发送。