因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用~
QQ邮箱发送邮件
#region 发送邮箱try{MailMessage mail = new MailMessage();MailAddress from = new MailAddress("发件人邮箱", "工程管理平台", System.Text.Encoding.GetEncoding("GB2312"));//邮件的发件人mail.From = from;MailAddress to = new MailAddress("收件人邮箱");//设置邮件的收件人 mail.To.Add(to);mail.Subject = "收款确认";string url = "http://wwww.baidu.com";mail.Body = "您好,有新的待确认收款" + url;mail.IsBodyHtml = true;//HTML格式,内容可以包含HMTL标签和超链接uuu mail.BodyEncoding = System.Text.Encoding.GetEncoding("GB2312");//设置邮件的格式mail.Priority = MailPriority.Normal;//设置邮件的发送级别mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;SmtpClient client = new SmtpClient();//邮件发送服务器//client.Port = 25; QQ发送邮件不用设置client.Host = "smtp.qq.com"; //发件人地址所在的服务器SMTP 如网易126邮箱的为smtp.126.comclient.EnableSsl = true;client.UseDefaultCredentials = false; //设置用于 SMTP 事务的端口,默认的是 25client.Credentials = new System.Net.NetworkCredential("发件人邮箱", "授权码");//发件人邮箱登陆名和密码(生成的授权码)client.DeliveryMethod = SmtpDeliveryMethod.Network;try{client.Send(mail);//发送邮件MessageShow("发送成功");Response.Write("<script language='javascript'>alert('发送成功!');</script>");}catch (System.Net.Mail.SmtpException ex){MessageShow(ex.Message);}}catch (Exception ex){throw ex;}#endregion
效果:
注意
重要引用:
using System.Net.Mail;
其中,使用QQ发送邮件,需要使用授权码而不是QQ密码,授权码具体生成方式可以查看:http://service.mail.qq.com/cgi-bin/help?subtype=1&&no=1001256&&id=28
自定义发送邮件
附帮助类的发送邮件方式(推荐此种方式,更灵活)
邮件帮助类
1 #region 邮件帮助类 2 /// <summary> 3 /// 邮件帮助类 4 /// </summary> 5 public static class SendMailHelper 6 { 7 /// <summary> 8 /// 发送邮件 9 /// </summary> 10 /// <param name="request">邮件内容对象</param> 11 /// <returns>发送邮件所遇到的异常</returns> 12 public static string SendMail(MailRequest request) 13 { 14 try 15 { 16 MailMessage mail = new MailMessage(); 17 18 if (string.IsNullOrEmpty(request.From)) 19 { 20 request.From = ConfigurationManager.AppSettings["DefaultMailFrom"]; 21 } 22 mail.From = new MailAddress(request.From); 23 24 PaserMailAddress(request.To, mail.To); 25 PaserMailAddress(request.CC, mail.CC); 26 PaserMailAddress(request.Bcc, mail.Bcc); 27 28 mail.Subject = request.Subject; 29 mail.SubjectEncoding = System.Text.Encoding.UTF8; 30 mail.Body = request.Body; 31 mail.ReplyTo = new MailAddress(request.From); 32 mail.IsBodyHtml = true; 33 34 if (request.Attachments != null && request.Attachments.Length > 0) 35 { 36 for (int i = 0; i < request.Attachments.Length; i++) 37 { 38 Attachment mailAttach = new Attachment(ByteArrayToStream(request.Attachments[i].FileData), request.Attachments[i].FileName); 39 40 mail.Attachments.Add(mailAttach); 41 } 42 } 43 44 if (string.IsNullOrEmpty(System.Configuration.ConfigurationManager.AppSettings["SMTPSERVER_Show"])) 45 { 46 throw new ApplicationException("邮件服务无效"); 47 } 48 49 //Smtp Server 50 SmtpClient mailClient = new SmtpClient(ConfigurationManager.AppSettings["SMTPSERVER_Show"]); 51 52 if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["SMTPSERVERPORT"])) 53 { 54 //端口号 55 try 56 { 57 mailClient.Port = Int32.Parse(ConfigurationManager.AppSettings["SMTPSERVERPORT"]); 58 } 59 catch 60 { 61 return "SMTP服务器端口设置错误,端口必须设置为数值型"; 62 } 63 } 64 65 if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["MAILUSER_Show"])) 66 { 67 mailClient.Credentials = new System.Net.NetworkCredential(ConfigurationManager.AppSettings["MAILUSER_Show"], ConfigurationManager.AppSettings["MAILUSERPW_Show"]); 68 mailClient.DeliveryMethod = SmtpDeliveryMethod.Network; 69 } 70 else 71 { 72 mailClient.Credentials = CredentialCache.DefaultNetworkCredentials; 73 } 74 75 mailClient.Send(mail); 76 mail.Dispose(); 77 78 return string.Empty; 79 } 80 catch (SmtpFailedRecipientsException e) 81 { 82 return e.Message; 83 } 84 catch (SmtpFailedRecipientException e) 85 { 86 return e.Message; 87 } 88 catch (SmtpException e) 89 { 90 return e.Message; 91 } 92 catch (Exception e) 93 { 94 return e.Message; 95 } 96 } 97 98 /// <summary> 99 /// 解析分解邮件地址 100 /// </summary> 101 /// <param name="mailAddress">邮件地址</param> 102 /// <param name="mailCollection">邮件对象</param> 103 private static void PaserMailAddress(string mailAddress, MailAddressCollection mailCollection) 104 { 105 if (string.IsNullOrEmpty(mailAddress)) 106 { 107 return; 108 } 109 110 char[] separator = new char[2] { ',', ';' }; 111 string[] addressArray = mailAddress.Split(separator); 112 113 foreach (string address in addressArray) 114 { 115 if (address.Trim() == string.Empty) 116 { 117 continue; 118 } 119 120 mailCollection.Add(new MailAddress(address)); 121 } 122 } 123 124 /// <summary> 125 /// 字节数组转换为流 126 /// </summary> 127 /// <param name="byteArray">字节数组</param> 128 /// <returns>Stream</returns> 129 private static Stream ByteArrayToStream(byte[] byteArray) 130 { 131 MemoryStream mstream = new MemoryStream(byteArray); 132 133 return mstream; 134 } 135 } 136 #endregion
补充上述帮助类中,还需要添加 MailRequest.cs 类(发送请求相关类) 和 MailRequestAttachments.cs 类(附件类)
MailRequest.cs 类
using System; using System.Collections.Generic; using System.Text;namespace SyncAdData.DBHelper {/// <summary>/// 发送邮件请求/// </summary>public class MailRequest{#region PrivateFields/// <summary>/// 文件名/// </summary>private string _fromField;/// <summary>/// 返送到/// </summary>private string _toField;/// <summary>/// 抄送/// </summary>private string _copyField;/// <summary>/// 附件/// </summary>private string _bccField;/// <summary>/// 标题/// </summary>private string _subjectField;/// <summary>/// 发送人名/// </summary>private string _bodyField;/// <summary>/// 类容/// </summary>private MailRequestAttachments[] _attachmentsField;#endregion/// <summary>/// 发送人,多个人以分号;间隔/// </summary>public string From{get{return this._fromField;}set{this._fromField = value;}}/// <summary>/// 收件人,多个人以分号;间隔/// </summary>public string To{get{return this._toField;}set{this._toField = value;}}/// <summary>/// 抄送人,多个人以分号;间隔/// </summary>public string CC{get{return this._copyField;}set{this._copyField = value;}}/// <summary>/// 秘密抄送人,多个人以分号;间隔/// </summary>public string Bcc{get{return this._bccField;}set{this._bccField = value;}}/// <summary>/// 主题/// </summary>public string Subject{get{return this._subjectField;}set{this._subjectField = value;}}/// <summary>/// 内容/// </summary>public string Body{get{return this._bodyField;}set{this._bodyField = value;}}/// <summary>/// 附件列表/// </summary>public MailRequestAttachments[] Attachments{get{return this._attachmentsField;}set{this._attachmentsField = value;}}} }
MailRequestAttachments.cs 类
using System; using System.Collections.Generic; using System.Text;namespace SyncAdData.DBHelper {/// <summary>/// 发送邮件请求附件/// </summary>public class MailRequestAttachments{#region PrivateFields/// <summary>/// 文件名/// </summary>private string _fileNameField;/// <summary>/// 文件内容/// </summary>private byte[] _fileDataField;#endregion/// <summary>/// 文件名/// </summary>public string FileName{get{return this._fileNameField;}set{this._fileNameField = value;}}/// <summary>/// 文件内容/// </summary>public byte[] FileData{get{return this._fileDataField;}set{this._fileDataField = value;}}} }
需要的命名空间
using System; using System.Reflection; using System.Net.Mail; using System.Web.Configuration; using System.Net; using System.IO;
其中 帮助类中的服务器地址 和 账号 密码需要在配置文件中配置
<add key="SMTPSERVER" value="邮件服务器"/><add key="MAILUSER" value="账号"/><add key="MAILUSERPW" value="密码"/>
前台调用
/// <summary>/// 发送邮件/// </summary>/// <param name="StrUrl">根据业务需要,这里我需要传入几个拼接后的id值</param>/// <param name="bid">根据业务需要,这里我传的批次id</param>/// <param name="showemail">根据业务需要,这里我传入的是查询出来的收件人邮箱(如果是固定的更好,可以直接写死或者写成配置文件)</param>private void Send(string StrUrl,string bid,string showemail){ #region 读取配置发送邮件string url = "http://localhost:9998/FinanceManage/CollectionManage/ConfirmCollection_Receipt.aspx?MenuID=14010600&id=" + StrUrl + "&batchID=" + bid + "";string body = "您好,有新的待确认收款≥ "+url;//string bcc = string.Empty;string to = "v-zhangxy52@vanke.com";//收件人//string cc = "";//抄送人MailRequest mail = new MailRequest();mail.Subject = "收款确认";//主题mail.Body = body;//内容// mail.Bcc = bcc;//秘密抄送人mail.From = "v-tangqq02@vanke.com";//发送人mail.To = to; //收件人// mail.CC = cc; //抄送人string sendMainResult = "-1";if (!string.IsNullOrEmpty(mail.To.Trim()) || !string.IsNullOrEmpty(mail.CC.Trim())){sendMainResult = SendMailHelper.SendMail(mail);if (string.IsNullOrEmpty(sendMainResult)){BaseClass.CommFun.Alert(this.up_innerCheck, "发送成功!", Page);}}#endregion }
效果
点击确定发送之后,查看邮箱,即可看到发送内容(可根据业务需求自行调整)
刚好另一个项目中也需要用到发邮件,也是用的上述的帮助类,附效果图
至此,发送邮件功能已经全部完毕,当中不乏可以优化的地方,欢迎大家自行优化,相互交流~