邮件发送需考虑很多因素,包孕发送邮件客户端(一般编码实现),发送和接收邮件处事器设置等。如果使用第三方邮件处事器作为发送处事器,就需要考虑该处事器的发送限制,(如发送邮件时间间隔,单位时间内发送邮件数量,是否使用安适连接SSL),同时无论使用第三方还是本身的邮件处事器都还需要考虑接收邮件处事器的限制。为理清思路,下面我们简单回顾电子邮件系统的根基网络布局和邮件发送接收流程。
一、电子邮件系统的根基网络布局
如下图:
邮件发送接收一般颠末以下几个节点:
发送过程中客户端与处事器及处事器之间使用SMTP协议,在接收过程中客户端与处事端之间使用POP3或IMAP(POP3的替代协议,撑持邮件摘要显示和脱机操纵)。邮件发送可简单认为是一种文件传输,但与FTP实时文件传输差别,各邮件处事器会生存邮件文件自己,直至被下一个邮件处事器或客户端接收,类似异步与同步的分歧。
由上可知,为顺利发送和接受邮件,客户端设置或编码需要严格适应邮件处事器的要求。对付发送邮件需明确:SMTP处事器地点和端口(默认端口25),是否使用安适连接(SSL),验证根据(用户和暗码),及越发细节的邮件格局,邮件编码方法等;对付接收邮件需明确:POP3或IMAP处事器地点和端口(POP3默认端口110,IMAP默认端口143),是否使用安适连接(SSL),验证根据(用户和暗码)
二、C#下发送邮件组件及测试
C#下发送邮件的组件使用较为遍及的有以下三个:System.Net.Mail, OpenSmtp, LumiSoft.Net。下面我们就分袂对他们进行测试。
发送邮件至少需要发送邮件处事器信息和邮件信息,因此我们成立Host和Mail两个配置类。
public class ConfigHost { public string Server { get; set; } public int Port { get; set; } public string Username { get; set; } public string Password { get; set; } public bool EnableSsl { get; set; } } public class ConfigMail { public string From { get; set; } public string[] To { get; set; } public string Subject { get; set; } public string Body { get; set; } public string[] Attachments { get; set; } public string[] Resources { get; set; } }
同时界说一个统一的接口ISendMail,以便利测试和对照。
public interface ISendMail { void CreateHost(ConfigHost host); void CreateMail(ConfigMail mail); void CreateMultiMail(ConfigMail mail); void SendMail(); }
1、使用System.Net.Mail
System.Net.Mail属于.Net Framework 的一部分,.Net2.0以后可以使用这个组件。
using System.Net.Mail; public class UseNetMail : ISendMail { private MailMessage Mail { get; set; } private SmtpClient Host { get; set; } public void CreateHost(ConfigHost host) { Host = new SmtpClient(host.Server, host.Port); Host.Credentials = new System.Net.NetworkCredential(host.Username, host.Password); Host.EnableSsl = host.EnableSsl; } public void CreateMail(ConfigMail mail) { Mail = new MailMessage(); Mail.From = new MailAddress(mail.From); foreach (var t in mail.To) Mail.To.Add(t); Mail.Subject = mail.Subject; Mail.Body = mail.Body; Mail.IsBodyHtml = true; Mail.BodyEncoding = System.Text.Encoding.UTF8; } public void CreateMultiMail(ConfigMail mail) { CreateMail(mail); Mail.AlternateViews.Add(AlternateView.CreateAlternateViewFromString("If you see this message, it means that your mail client does not support html.", Encoding.UTF8, "text/plain")); var html = AlternateView.CreateAlternateViewFromString(mail.Body, Encoding.UTF8, "text/html"); foreach (string resource in mail.Resources) { var image = new LinkedResource(resource, "image/jpeg"); image.ContentId = Convert.ToBase64String(Encoding.Default.GetBytes(Path.GetFileName(resource))); html.LinkedResources.Add(image); } Mail.AlternateViews.Add(html); foreach (var attachment in mail.Attachments) { Mail.Attachments.Add(new Attachment(attachment)); } } public void SendMail() { if (Host != null && Mail != null) Host.Send(Mail); else throw new Exception("These is not a host to send mail or there is not a mail need to be sent."); } }
2、使用OpenSmtp
开源的发送邮件组件,可以在这里获得源码。但是OpenSmtp目前不撑持SSL。