分享一个异步发送邮件的C#类代码
首先要定义一个邮件信息的基类,如下所示: /// <summary> /// Base message class used for emails /// </summary> public class Message { #region Constructor /// <summary> /// Constructor /// </summary> public Message() { } #endregion #region Properties /// <summary> /// Whom the message is to /// </summary> public virtual string To { get; set; } /// <summary> /// The subject of the email /// </summary> public virtual string Subject { get; set; } /// <summary> /// Whom the message is from /// </summary> public virtual string From { get; set; } /// <summary> /// Body of the text /// </summary> public virtual string Body { get; set; } #endregion } 然后定义一个邮件的发送类,使用Netmail的方式发送邮件,发送邮件时采用了.net中自带的线程池, 通过多线程来实现异步的发送,代码如下: /// <summary> /// Utility for sending an email /// </summary> public class EmailSender : Message { #region Constructors /// <summary> /// Default Constructor /// </summary> public EmailSender() { Attachments = new List<Attachment>(); EmbeddedResources = new List<LinkedResource>(); Priority = MailPriority.Normal; } #endregion #region Public Functions /// <summary> /// Sends an email /// </summary> /// <param name="Message">The body of the message</param> public void SendMail(string Message) { Body = Message; SendMail(); } /// <summary> /// Sends a piece of mail asynchronous /// </summary> /// <param name="Message">Message to be sent</param> public void SendMailAsync(string Message) { Body = Message; ThreadPool.QueueUserWorkItem(delegate { SendMail(); }); } /// <summary> /// Sends an email /// </summary> public void SendMail() { using (System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage()) { char[] Splitter = { ',', ';' }; string[] AddressCollection = To.Split(Splitter); for (int x = 0; x < AddressCollection.Length; ++x) { if(!string.IsNullOrEmpty(AddressCollection[x].Trim())) message.To.Add(AddressCollection[x]); } if (!string.IsNullOrEmpty(CC)) { AddressCollection = CC.Split(Splitter); for (int x = 0; x < AddressCollection.Length; ++x) { if (!string.IsNullOrEmpty(AddressCollection[x].Trim())) message.CC.Add(AddressCollection[x]); } } if (!string.IsNullOrEmpty(Bcc)) { AddressCollection = Bcc.Split(Splitter); for (int x = 0; x < AddressCollection.Length; ++x) { if (!string.IsNullOrEmpty(AddressCollection[x].Trim())) message.Bcc.Add(AddressCollection[x]); } } message.Subject = Subject; message.From = new System.Net.Mail.MailAddress((From)); AlternateView BodyView = AlternateView.CreateAlternateViewFromString(Body, null, MediaTypeNames.Text.Html); foreach (LinkedResource Resource in EmbeddedResources) { BodyView.LinkedResources.Add(Resource); } message.AlternateViews.Add(BodyView); //message.Body = Body; message.Priority = Priority; message.SubjectEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1"); message.BodyEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1"); message.IsBodyHtml = true; foreach (Attachment TempAttachment in Attachments) { message.Attachments.Add(TempAttachment); } System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(Server, Port); if (!string.IsNullOrEmpty(UserName) && !string.IsNullOrEmpty(Password)) { smtp.Credentials = new System.Net.NetworkCredential(UserName, Password); } if (UseSSL) smtp.EnableSsl = true; else smtp.EnableSsl = false; smtp.Send(message); } } /// <summary> /// Sends a piece of mail asynchronous /// </summary> public void SendMailAsync() { ThreadPool.QueueUserWorkItem(delegate { SendMail(); }); } #endregion #region Properties /// <summary> /// Any attachments that are included with this /// message. /// </summary> public List<Attachment> Attachments { get; set; } /// <summary> /// Any attachment (usually images) that need to be embedded in the message /// </summary> public List<LinkedResource> EmbeddedResources { get; set; } /// <summary> /// The priority of this message /// </summary> public MailPriority Priority { get; set; } /// <summary> /// Server Location /// </summary> public string Server { get; set; } /// <summary> /// User Name for the server /// </summary> public string UserName { get; set; } /// <summary> /// Password for the server /// </summary> public string Password { get; set; } /// <summary> /// Port to send the information on /// </summary> public int Port { get; set; } /// <summary> /// Decides whether we are using STARTTLS (SSL) or not /// </summary> public bool UseSSL { get; set; } /// <summary> /// Carbon copy send (seperate email addresses with a comma) /// </summary> public string CC { get; set; } /// <summary> /// Blind carbon copy send (seperate email addresses with a comma) /// </summary> public string Bcc { get; set; } #endregion }