邮件发送功能已经做了好了次了,有带有附件的和不带附件的,如果不在一个工程里每次使用都要复制粘贴一遍,很麻烦,所以我就想着能不能自己封装一下,生成dll文件。用的时候引用dll文件就行了。这样应该方便多了。目前发送邮件的号是QQ号,接收方不限制。
首先定义一个发送邮件的接口:
public interface IEmail { /// <summary> /// 邮件发送,只发送内容 /// </summary> /// <param name="sendEmail">发送人Email</param> /// <param name="sendEmailCode">发送人Email授权码</param> /// <param name="receiveEmail">接收人Email</param> /// <param name="sendContent">发送内容</param> /// <param name="reSend">是否启用重发机制</param> public void SendEmail(string sendEmail, string sendEmailCode, string receiveEmail, string sendContent, bool reSend); /// <summary> /// 邮件发送,只发送内容,群发 /// </summary> /// <param name="sendEmail">发送人Email</param> /// <param name="sendEmailCode">发送人Email授权码</param> /// <param name="receiveEmail">接收人邮件数组</param> /// <param name="sendContent">发送内容</param> /// <param name="reSend">是否启用重发机制</param> public void SendStringEmail(string sendEmail, string sendEmailCode, string[] receiveEmail, string sendContent, bool reSend); /// <summary> /// 邮件发送,发送内容和标题 /// </summary> /// <param name="sendEmail">发送人Email</param> /// <param name="sendEmailCode">发送人Email授权码</param> /// <param name="receiveEmail">接收人Email</param> /// <param name="titleEmail">邮件标题</param> /// <param name="sendContent">邮件内容</param> /// <param name="reSend"是否启用重发机制></param> public void SendEmail(string sendEmail, string sendEmailCode, string receiveEmail, string titleEmail, string sendContent, bool reSend); /// <summary> /// 邮件发送,发送内容和标题 /// </summary> /// <param name="sendEmail">发送人Email</param> /// <param name="sendEmailCode">发送人Email授权码</param> /// <param name="receiveEmail">接收人Email群</param> /// <param name="titleEmail">邮件标题</param> /// <param name="sendContent">邮件内容</param> /// <param name="reSend"是否启用重发机制></param> public void SendStringTitleEmail(string sendEmail, string sendEmailCode, string[] receiveEmail, string titleEmail, string sendContent, bool reSend); /// <summary> /// 发送邮件,发送内容,标题,附件 /// </summary> /// <param name="sendEmail">Email发送人</param> /// <param name="sendEmailCode">Email授权码</param> /// <param name="receiveEmail">邮件接收人</param> /// <param name="annexUrl">附件路径</param> /// <param name="titleEmail">邮件标题</param> /// <param name="annexEmail">附件标题</param> /// <param name="reSend">是否启用重发机制</param> public void SendEmail(string sendEmail, string sendEmailCode, string receiveEmail, string annexUrl, string titleEmail, string annexEmail, bool reSend); /// <summary> /// 邮件发送:发送内容,标题,多个附件 /// </summary> /// <param name="sendEmail">邮件发送人</param> /// <param name="sendEmailCode">邮件授权码</param> /// <param name="receiveEmail">邮件接收人</param> /// <param name="annexUrl">多个附件数组</param> /// <param name="titleEmail">邮件标题</param> /// <param name="annexEmail">附件标题</param> /// <param name="reSend">是否启用重发机制</param> public void SendUrlEmail(string sendEmail, string sendEmailCode, string receiveEmail, List<string> annexUrl, string titleEmail, string annexEmail, bool reSend); /// <summary> /// 邮件发送:群发,发送内容,标题,多个附件 /// </summary> /// <param name="sendEmail">邮件发送人</param> /// <param name="sendEmailCode">邮件授权码</param> /// <param name="receiveEmail">邮件接收人数组</param> /// <param name="annexUrl">附件路径数组</param> /// <param name="titleEmail">邮件标题</param> /// <param name="annexEmail">附件标题</param> /// <param name="reSend">是否启用重发机制</param> public void SendListUrlEmail(string sendEmail, string sendEmailCode, string[] receiveEmail, List<string> annexUrl, string titleEmail, string annexEmail, bool reSend); }
邮件发送的实现类:
public class ConnectEMail : IEmail { /// <summary> /// 邮件发送,只发送内容 /// </summary> /// <param name="sendEmail">发送人Email</param> /// <param name="sendEmailCode">发送人Email授权码</param> /// <param name="receiveEmail">接收人Email</param> /// <param name="sendContent">发送内容</param> /// <param name="reSend">是否启用重发机制</param> public void SendEmail(string sendEmail, string sendEmailCode, string receiveEmail, string sendContent, bool reSend) { SmtpClient smtpclient = EmailHelper.GetSmtpClient(sendEmail, sendEmailCode); MailMessage mailMessage = EmailHelper.GetMailMessage(sendEmail, receiveEmail, "", sendContent); try { smtpclient.Send(mailMessage); } catch (Exception e) { //启用重发机制 if (reSend == true) { Task.Run(() => { Thread.Sleep(5000); Console.WriteLine("启用了重发机制。。。。"); SendEmail(sendEmail, sendEmailCode, receiveEmail, sendContent, reSend); }); } } } /// <summary> /// 邮件发送,发送内容和标题 /// </summary> /// <param name="sendEmail">发送人Email</param> /// <param name="sendEmailCode">发送人Email授权码</param> /// <param name="receiveEmail">接收人Email</param> /// <param name="titleEmail">邮件标题</param> /// <param name="sendContent">邮件内容</param> /// <param name="reSend"是否启用重发机制></param> public void SendEmail(string sendEmail, string sendEmailCode, string receiveEmail, string titleEmail, string sendContent, bool reSend) { SmtpClient smtpclient = EmailHelper.GetSmtpClient(sendEmail, sendEmailCode); MailMessage mailMessage = EmailHelper.GetMailMessage(sendEmail, receiveEmail, titleEmail, sendContent); try { smtpclient.Send(mailMessage); } catch (Exception) { //启用重发机制 if (reSend == true) { Task.Run(() => { Thread.Sleep(5000); SendEmail(sendEmail, sendEmailCode, receiveEmail, titleEmail, sendContent, reSend); }); } } } /// <summary> /// 发送邮件,发送内容,标题,附件 /// </summary> /// <param name="sendEmail">Email发送人</param> /// <param name="sendEmailCode">Email授权码</param> /// <param name="receiveEmail">邮件接收人</param> /// <param name="annexUrl">附件路径</param> /// <param name="titleEmail">邮件标题</param> /// <param name="annexEmail">附件标题</param> /// <param name="reSend">是否启用重发机制</param> public void SendEmail(string sendEmail, string sendEmailCode, string receiveEmail, string annexUrl, string titleEmail, string annexEmail, bool reSend) { SmtpClient smtpclient = EmailHelper.GetSmtpClient(sendEmail, sendEmailCode); MailMessage mailMessage = EmailHelper.GetMailMessage(sendEmail, receiveEmail, titleEmail, ""); Attachment myAttachment = EmailHelper.GetAttachment(annexUrl); mailMessage.Attachments.Add(myAttachment); try { smtpclient.Send(mailMessage); } catch (Exception) { //启用重发机制 if (reSend == true) { Task.Run(() => { Thread.Sleep(5000); SendEmail(sendEmail, sendEmailCode, receiveEmail, annexUrl, titleEmail, annexEmail, reSend); }); } } } /// <summary> /// 邮件发送:群发,发送内容,标题,多个附件 /// </summary> /// <param name="sendEmail">邮件发送人</param> /// <param name="sendEmailCode">邮件授权码</param> /// <param name="receiveEmail">邮件接收人数组</param> /// <param name="annexUrl">附件路径数组</param> /// <param name="titleEmail">邮件标题</param> /// <param name="annexEmail">附件标题</param> /// <param name="reSend">是否启用重发机制</param> public void SendListUrlEmail(string sendEmail, string sendEmailCode, string[] receiveEmail, List<string> annexUrl, string titleEmail, string annexEmail, bool reSend) { for (int i = 0; i < receiveEmail.Length; i++) { SmtpClient smtpclient = EmailHelper.GetSmtpClient(sendEmail, sendEmailCode); MailMessage mailMessage = EmailHelper.GetMailMessage(sendEmail, receiveEmail[i], titleEmail, ""); for (int j = 0; j < annexUrl.Count; j++) { if (!string.IsNullOrEmpty(annexUrl[j]) && EmailHelper.SelectFile(annexUrl[j])) { Attachment myAttachment = EmailHelper.GetAttachment(annexUrl[j]); mailMessage.Attachments.Add(myAttachment); } } try { smtpclient.Send(mailMessage); } catch (Exception) { //启用重发机制 if (reSend == true) { Task.Run(() => { Thread.Sleep(5000); SendUrlEmail(sendEmail, sendEmailCode, receiveEmail[i], annexUrl, titleEmail, annexEmail, reSend); }); } } } } /// <summary> /// 邮件发送,只发送内容,群发 /// </summary> /// <param name="sendEmail">发送人Email</param> /// <param name="sendEmailCode">发送人Email授权码</param> /// <param name="receiveEmail">接收人邮件数组</param> /// <param name="sendContent">发送内容</param> /// <param name="reSend">是否启用重发机制</param> public void SendStringEmail(string sendEmail, string sendEmailCode, string[] receiveEmail, string sendContent, bool reSend) { for (int i = 0; i < receiveEmail.Length; i++) { SmtpClient smtpclient = EmailHelper.GetSmtpClient(sendEmail, sendEmailCode); MailMessage mailMessage = EmailHelper.GetMailMessage(sendEmail, receiveEmail[i], "", sendContent); try { smtpclient.Send(mailMessage); } catch (Exception) { //启用重发机制 if (reSend == true) { Task.Run(() => { Thread.Sleep(5000); SendEmail(sendEmail, sendEmailCode, receiveEmail[i], sendContent, reSend); }); } } } } /// <summary> /// 邮件发送,发送内容和标题 /// </summary> /// <param name="sendEmail">发送人Email</param> /// <param name="sendEmailCode">发送人Email授权码</param> /// <param name="receiveEmail">接收人Email群</param> /// <param name="titleEmail">邮件标题</param> /// <param name="sendContent">邮件内容</param> /// <param name="reSend"是否启用重发机制></param> public void SendStringTitleEmail(string sendEmail, string sendEmailCode, string[] receiveEmail, string titleEmail, string sendContent, bool reSend) { for (int i = 0; i < receiveEmail.Length; i++) { SmtpClient smtpclient = EmailHelper.GetSmtpClient(sendEmail, sendEmailCode); MailMessage mailMessage = EmailHelper.GetMailMessage(sendEmail, receiveEmail[i], titleEmail, sendContent); try { smtpclient.Send(mailMessage); } catch (Exception) { //启用重发机制 if (reSend == true) { Task.Run(() => { Thread.Sleep(5000); SendEmail(sendEmail, sendEmailCode, receiveEmail[i], titleEmail, sendContent, reSend); }); } } } } /// <summary> /// 邮件发送:发送内容,标题,多个附件 /// </summary> /// <param name="sendEmail">邮件发送人</param> /// <param name="sendEmailCode">邮件授权码</param> /// <param name="receiveEmail">邮件接收人</param> /// <param name="annexUrl">多个附件数组</param> /// <param name="titleEmail">邮件标题</param> /// <param name="annexEmail">附件标题</param> /// <param name="reSend">是否启用重发机制</param> public void SendUrlEmail(string sendEmail, string sendEmailCode, string receiveEmail, List<string> annexUrl, string titleEmail, string annexEmail, bool reSend) { SmtpClient smtpclient = EmailHelper.GetSmtpClient(sendEmail, sendEmailCode); MailMessage mailMessage = EmailHelper.GetMailMessage(sendEmail, receiveEmail, titleEmail, annexEmail); for (int j = 0; j < annexUrl.Count; j++) { if (!string.IsNullOrEmpty(annexUrl[j]) && EmailHelper.SelectFile(annexUrl[j])) { Attachment myAttachment = EmailHelper.GetAttachment(annexUrl[j]); mailMessage.Attachments.Add(myAttachment); } try { smtpclient.Send(mailMessage); } catch (Exception) { //启用重发机制 if (reSend == true) { Task.Run(() => { Thread.Sleep(5000); SendUrlEmail(sendEmail, sendEmailCode, receiveEmail, annexUrl, titleEmail, annexEmail, reSend); }); } } } } }
构建发送邮件客户端类:
public class EmailHelper { public static SmtpClient GetSmtpClient(string sendEmail, string sendEmailCode) { SmtpClient smtpclient = new SmtpClient("smtp.qq.com"); //邮件发送方式 通过网络发送到smtp服务器 smtpclient.DeliveryMethod = SmtpDeliveryMethod.Network; //如果服务器支持安全连接,则将安全连接设为true smtpclient.EnableSsl = true; //是否使用默认凭据,若为false,则使用自定义的证书,就是下面的networkCredential实例对象 smtpclient.UseDefaultCredentials = false; //指定邮箱账号和密码,需要注意的是,这个密码是你在QQ邮箱设置里开启服务的时候给你的那个授权码 NetworkCredential networkCredential = new NetworkCredential(sendEmail, sendEmailCode); smtpclient.Credentials = networkCredential; return smtpclient; } public static MailMessage GetMailMessage(string sendEmail, string receiveEmail, string titleEmail, string sendContent) { //确定发件地址与收件地址 MailAddress sendAddress = new MailAddress(sendEmail); MailAddress receiveAddress = new MailAddress(receiveEmail); //构造一个Email的Message对象 内容信息 MailMessage mailMessage = new MailMessage(sendAddress, receiveAddress); mailMessage.Subject = titleEmail + DateTime.Now; mailMessage.SubjectEncoding = System.Text.Encoding.UTF8; mailMessage.Body = sendContent; mailMessage.BodyEncoding = System.Text.Encoding.UTF8; return mailMessage; } /// <summary> /// 附件路径 /// </summary> /// <param name="annexUrl">路径</param> /// <returns></returns> public static Attachment GetAttachment(string annexUrl) { //附件 Attachment myAttachment = new System.Net.Mail.Attachment(annexUrl, MediaTypeNames.Application.Octet); //MIME协议下的一个对象,用以设置附件的创建时间,修改时间以及读取时间 ContentDisposition disposition = myAttachment.ContentDisposition; disposition.CreationDate = File.GetCreationTime(annexUrl); disposition.ModificationDate = File.GetLastWriteTime(annexUrl); disposition.ReadDate = File.GetLastAccessTime(annexUrl); return myAttachment; } /// <summary> /// 判断文件是否存在 /// </summary> /// <param name="strFileName">路径</param> /// <returns></returns> public static bool SelectFile(string strFileName) { strFileName = strFileName.Replace("/", "\"); //存在文件 if (File.Exists(strFileName)) { return true; } else //不存在文件 { return false; } } }
外部调用邮件发送类:
/// <summary> /// 发送邮件通用类 /// </summary> public class EMail { /// <summary> /// 邮件发送,只发送内容 /// </summary> /// <param name="sendEmail">发送人Email</param> /// <param name="sendEmailCode">发送人Email授权码</param> /// <param name="receiveEmail">接收人Email</param> /// <param name="sendContent">发送内容</param> /// <param name="reSend">是否启用重发机制</param> public static void SendEmail(string sendEmail, string sendEmailCode, string receiveEmail, string sendContent, bool reSend) { new ConnectEMail().SendEmail(sendEmail, sendEmailCode, receiveEmail, sendContent, reSend); } /// <summary> /// 邮件发送,发送内容和标题 /// </summary> /// <param name="sendEmail">发送人Email</param> /// <param name="sendEmailCode">发送人Email授权码</param> /// <param name="receiveEmail">接收人Email</param> /// <param name="titleEmail">邮件标题</param> /// <param name="sendContent">邮件内容</param> /// <param name="reSend"是否启用重发机制></param> public static void SendEmail(string sendEmail, string sendEmailCode, string receiveEmail, string titleEmail, string sendContent, bool reSend) { new ConnectEMail().SendEmail(sendEmail, sendEmailCode, receiveEmail, titleEmail, sendContent, reSend); } /// <summary> /// 发送邮件,发送内容,标题,附件 /// </summary> /// <param name="sendEmail">Email发送人</param> /// <param name="sendEmailCode">Email授权码</param> /// <param name="receiveEmail">邮件接收人</param> /// <param name="annexUrl">附件路径</param> /// <param name="titleEmail">邮件标题</param> /// <param name="annexEmail">附件标题</param> /// <param name="reSend">是否启用重发机制</param> public static void SendEmail(string sendEmail, string sendEmailCode, string receiveEmail, string annexUrl, string titleEmail, string annexEmail, bool reSend) { new ConnectEMail().SendEmail(sendEmail, sendEmailCode, receiveEmail, annexUrl, titleEmail, annexEmail, reSend); } /// <summary> /// 邮件发送:群发,发送内容,标题,多个附件 /// </summary> /// <param name="sendEmail">邮件发送人</param> /// <param name="sendEmailCode">邮件授权码</param> /// <param name="receiveEmail">邮件接收人数组</param> /// <param name="annexUrl">附件路径数组</param> /// <param name="titleEmail">邮件标题</param> /// <param name="annexEmail">附件标题</param> /// <param name="reSend">是否启用重发机制</param> public static void SendListUrlEmail(string sendEmail, string sendEmailCode, string[] receiveEmail, List<string> annexUrl, string titleEmail, string annexEmail, bool reSend) { new ConnectEMail().SendListUrlEmail(sendEmail, sendEmailCode, receiveEmail, annexUrl, titleEmail, annexEmail, reSend); } /// <summary> /// 邮件发送,只发送内容,群发 /// </summary> /// <param name="sendEmail">发送人Email</param> /// <param name="sendEmailCode">发送人Email授权码</param> /// <param name="receiveEmail">接收人邮件数组</param> /// <param name="sendContent">发送内容</param> /// <param name="reSend">是否启用重发机制</param> public static void SendStringEmail(string sendEmail, string sendEmailCode, string[] receiveEmail, string sendContent, bool reSend) { new ConnectEMail().SendStringEmail(sendEmail, sendEmailCode, receiveEmail, sendContent, reSend); } /// <summary> /// 邮件发送,发送内容和标题 /// </summary> /// <param name="sendEmail">发送人Email</param> /// <param name="sendEmailCode">发送人Email授权码</param> /// <param name="receiveEmail">接收人Email群</param> /// <param name="titleEmail">邮件标题</param> /// <param name="sendContent">邮件内容</param> /// <param name="reSend"是否启用重发机制></param> public static void SendStringTitleEmail(string sendEmail, string sendEmailCode, string[] receiveEmail, string titleEmail, string sendContent, bool reSend) { new ConnectEMail().SendStringTitleEmail(sendEmail, sendEmailCode, receiveEmail, titleEmail, sendContent, reSend); } /// <summary> /// 邮件发送:发送内容,标题,多个附件 /// </summary> /// <param name="sendEmail">邮件发送人</param> /// <param name="sendEmailCode">邮件授权码</param> /// <param name="receiveEmail">邮件接收人</param> /// <param name="annexUrl">多个附件数组</param> /// <param name="titleEmail">邮件标题</param> /// <param name="annexEmail">附件标题</param> /// <param name="reSend">是否启用重发机制</param> public static void SendUrlEmail(string sendEmail, string sendEmailCode, string receiveEmail, List<string> annexUrl, string titleEmail, string annexEmail, bool reSend) { new ConnectEMail().SendUrlEmail(sendEmail, sendEmailCode, receiveEmail, annexUrl, titleEmail, annexEmail, reSend); } }
然后发布一下,就可以看到一个dll文件,用的时候直接把dll文件拷贝进去,添加一下引用就行了。