asp.net发送E-mail

来源:互联网 发布:php环境文件管理器 编辑:程序博客网 时间:2024/06/06 08:24

原文: http://blog.csdn.net/chinacsharper/article/details/9750303
发送电子邮件也是项目开发当中经常用到的功能,这里我整理了一个发送电子邮件(带附件,支持多用户发送,主送、抄送)的类库,供大家参考。

先上两个实体类,用于封装成Mail对象。

[csharp] view plaincopy
  1. /// <summary>  
  2. /// 发送邮件请求  
  3. /// </summary>  
  4. public class MailRequest  
  5. {  
  6.     #region PrivateFields  
  7.   
  8.     /// <summary>  
  9.     /// 文件名  
  10.     /// </summary>  
  11.     private string _fromField;  
  12.   
  13.     /// <summary>  
  14.     /// 返送到  
  15.     /// </summary>  
  16.     private string _toField;  
  17.   
  18.     /// <summary>  
  19.     /// 抄送  
  20.     /// </summary>  
  21.     private string _copyField;  
  22.   
  23.     /// <summary>  
  24.     /// 附件  
  25.     /// </summary>  
  26.     private string _bccField;  
  27.   
  28.     /// <summary>  
  29.     /// 标题  
  30.     /// </summary>  
  31.     private string _subjectField;  
  32.   
  33.     /// <summary>  
  34.     /// 发送人名  
  35.     /// </summary>  
  36.     private string _bodyField;  
  37.   
  38.     /// <summary>  
  39.     /// 类容  
  40.     /// </summary>  
  41.     private MailRequestAttachments[] _attachmentsField;  
  42.  
  43.     #endregion  
  44.   
  45.     /// <summary>  
  46.     /// 发送人,多个人以分号;间隔  
  47.     /// </summary>  
  48.     public string From  
  49.     {  
  50.         get  
  51.         {  
  52.             return this._fromField;  
  53.         }  
  54.   
  55.         set  
  56.         {  
  57.             this._fromField = value;  
  58.         }  
  59.     }  
  60.   
  61.     /// <summary>  
  62.     /// 收件人,多个人以分号;间隔  
  63.     /// </summary>  
  64.     public string To  
  65.     {  
  66.         get  
  67.         {  
  68.             return this._toField;  
  69.         }  
  70.   
  71.         set  
  72.         {  
  73.             this._toField = value;  
  74.         }  
  75.     }  
  76.   
  77.     /// <summary>  
  78.     /// 抄送人,多个人以分号;间隔  
  79.     /// </summary>  
  80.     public string CC  
  81.     {  
  82.         get  
  83.         {  
  84.             return this._copyField;  
  85.         }  
  86.   
  87.         set  
  88.         {  
  89.             this._copyField = value;  
  90.         }  
  91.     }  
  92.   
  93.     /// <summary>  
  94.     /// 秘密抄送人,多个人以分号;间隔  
  95.     /// </summary>  
  96.     public string Bcc  
  97.     {  
  98.         get  
  99.         {  
  100.             return this._bccField;  
  101.         }  
  102.   
  103.         set  
  104.         {  
  105.             this._bccField = value;  
  106.         }  
  107.     }  
  108.   
  109.     /// <summary>  
  110.     /// 主题  
  111.     /// </summary>  
  112.     public string Subject  
  113.     {  
  114.         get  
  115.         {  
  116.             return this._subjectField;  
  117.         }  
  118.   
  119.         set  
  120.         {  
  121.             this._subjectField = value;  
  122.         }  
  123.     }  
  124.   
  125.     /// <summary>  
  126.     /// 内容  
  127.     /// </summary>  
  128.     public string Body  
  129.     {  
  130.         get  
  131.         {  
  132.             return this._bodyField;  
  133.         }  
  134.   
  135.         set  
  136.         {  
  137.             this._bodyField = value;  
  138.         }  
  139.     }  
  140.   
  141.     /// <summary>  
  142.     /// 附件列表  
  143.     /// </summary>  
  144.     public MailRequestAttachments[] Attachments  
  145.     {  
  146.         get  
  147.         {  
  148.             return this._attachmentsField;  
  149.         }  
  150.   
  151.         set  
  152.         {  
  153.             this._attachmentsField = value;  
  154.         }  
  155.     }  
  156. }  
[csharp] view plaincopy
  1. /// <summary>  
  2. /// 发送邮件请求附件  
  3. /// </summary>  
  4. public class MailRequestAttachments  
  5. {  
  6.     #region PrivateFields  
  7.   
  8.     /// <summary>  
  9.     /// 文件名  
  10.     /// </summary>  
  11.     private string _fileNameField;  
  12.   
  13.     /// <summary>  
  14.     /// 文件内容  
  15.     /// </summary>  
  16.     private byte[] _fileDataField;  
  17.  
  18.     #endregion  
  19.   
  20.     /// <summary>  
  21.     /// 文件名  
  22.     /// </summary>  
  23.     public string FileName  
  24.     {  
  25.         get  
  26.         {  
  27.             return this._fileNameField;  
  28.         }  
  29.   
  30.         set  
  31.         {  
  32.             this._fileNameField = value;  
  33.         }  
  34.     }  
  35.   
  36.     /// <summary>  
  37.     /// 文件内容  
  38.     /// </summary>  
  39.     public byte[] FileData  
  40.     {  
  41.         get  
  42.         {  
  43.             return this._fileDataField;  
  44.         }  
  45.   
  46.         set  
  47.         {  
  48.             this._fileDataField = value;  
  49.         }  
  50.     }  
  51. }  
附件的内容很简单,因为在网络传输当中,是以字节流的形式传输的,因此附件的传输需要转换成字节流数组。
[csharp] view plaincopy
  1. /// <summary>  
  2. /// 邮件帮助类  
  3. /// </summary>  
  4. public static class MailHelper  
  5. {  
  6.     /// <summary>  
  7.     /// 发送邮件  
  8.     /// </summary>  
  9.     /// <param name="request">邮件内容对象</param>  
  10.     /// <returns>发送邮件所遇到的异常</returns>  
  11.     public static string SendMail(MailRequest request)  
  12.     {  
  13.         try  
  14.         {  
  15.             MailMessage mail = new MailMessage();  
  16.   
  17.             if (string.IsNullOrEmpty(request.From))  
  18.             {  
  19.                 request.From = WebConfigurationManager.AppSettings["DefaultMailFrom"];  
  20.             }  
  21.             mail.From = new MailAddress(request.From);  
  22.   
  23.             PaserMailAddress(request.To, mail.To);  
  24.             PaserMailAddress(request.CC, mail.CC);  
  25.             PaserMailAddress(request.Bcc, mail.Bcc);  
  26.   
  27.             mail.Subject = request.Subject;  
  28.             mail.SubjectEncoding = System.Text.Encoding.UTF8;  
  29.             mail.Body = request.Body;  
  30.             mail.ReplyTo = new MailAddress(request.From);  
  31.             mail.IsBodyHtml = true;  
  32.   
  33.             if (request.Attachments != null && request.Attachments.Length > 0)  
  34.             {  
  35.                 for (int i = 0; i < request.Attachments.Length; i++)  
  36.                 {  
  37.                     Attachment mailAttach = new Attachment(ByteArrayToStream(request.Attachments[i].FileData), request.Attachments[i].FileName);  
  38.   
  39.                     mail.Attachments.Add(mailAttach);  
  40.                 }  
  41.             }  
  42.   
  43.             if (string.IsNullOrEmpty(WebConfigurationManager.AppSettings["SMTPSERVER"]))  
  44.             {  
  45.                 throw new ApplicationException("邮件服务无效");  
  46.             }  
  47.   
  48.             //Smtp Server  
  49.             SmtpClient mailClient = new SmtpClient(WebConfigurationManager.AppSettings["SMTPSERVER"]);  
  50.   
  51.             if (!string.IsNullOrEmpty(WebConfigurationManager.AppSettings["SMTPSERVERPORT"]))  
  52.             {  
  53.                 //端口号  
  54.                 try  
  55.                 {  
  56.                     mailClient.Port = Int32.Parse(WebConfigurationManager.AppSettings["SMTPSERVERPORT"]);  
  57.                 }  
  58.                 catch  
  59.                 {  
  60.                     return "SMTP服务器端口设置错误,端口必须设置为数值型";  
  61.                 }  
  62.             }  
  63.   
  64.             if (!string.IsNullOrEmpty(WebConfigurationManager.AppSettings["MAILUSER"]))  
  65.             {  
  66.                 mailClient.Credentials = new System.Net.NetworkCredential(WebConfigurationManager.AppSettings["MAILUSER"], WebConfigurationManager.AppSettings["MAILUSERPW"]);  
  67.                 mailClient.DeliveryMethod = SmtpDeliveryMethod.Network;  
  68.             }  
  69.             else  
  70.             {  
  71.                 mailClient.Credentials = CredentialCache.DefaultNetworkCredentials;  
  72.             }  
  73.   
  74.             mailClient.Send(mail);  
  75.             mail.Dispose();  
  76.   
  77.             return "邮件发送成功。";  
  78.         }  
  79.         catch (SmtpFailedRecipientsException e)  
  80.         {  
  81.             return e.Message;  
  82.         }  
  83.         catch (SmtpFailedRecipientException e)  
  84.         {  
  85.             return e.Message;  
  86.         }  
  87.         catch (SmtpException e)  
  88.         {  
  89.             return e.Message;  
  90.         }  
  91.         catch (Exception e)  
  92.         {  
  93.             return e.Message;  
  94.         }  
  95.     }  
  96.   
  97.     /// <summary>  
  98.     /// 解析分解邮件地址  
  99.     /// </summary>  
  100.     /// <param name="mailAddress">邮件地址</param>  
  101.     /// <param name="mailCollection">邮件对象</param>  
  102.     private static void PaserMailAddress(string mailAddress, MailAddressCollection mailCollection)  
  103.     {  
  104.         if (string.IsNullOrEmpty(mailAddress))  
  105.         {  
  106.             return;  
  107.         }  
  108.   
  109.         char[] separator = new char[2] { ','';' };  
  110.         string[] addressArray = mailAddress.Split(separator);  
  111.   
  112.         foreach (string address in addressArray)  
  113.         {  
  114.             if (address.Trim() == string.Empty)  
  115.             {  
  116.                 continue;  
  117.             }  
  118.   
  119.             mailCollection.Add(new MailAddress(address));  
  120.         }  
  121.     }  
  122.   
  123.     /// <summary>  
  124.     /// 字节数组转换为流  
  125.     /// </summary>  
  126.     /// <param name="byteArray">字节数组</param>  
  127.     /// <returns>Stream</returns>  
  128.     private static Stream ByteArrayToStream(byte[] byteArray)  
  129.     {  
  130.         MemoryStream mstream = new MemoryStream(byteArray);  
  131.   
  132.         return mstream;  
  133.     }  
  134. }  
这是一个邮件助手类,定义成static,无需实例化,直接类名.方法名的形式调用。

只需要上述3个类就可以实现发送Email了,由于上面引用的是web.config里面的信息(asp.net等命名空间,如果是winform等需要自己修改一下),这里还需要配置一下web.config,如下所示:

[plain] view plaincopy
  1. <appSettings>  
  2.   <!--邮件发送配置-->  
  3.   <add key="SMTPSERVER" value="smtp.qq.com"/>  
  4.   <!--这是服务器邮箱的地址,如果是新浪,则填 smtp.sina.com-->  
  5.   <add key="MAILUSER" value="xxx"/>  
  6.   <!--注意!这是对应服务器邮箱的账号-->  
  7.   <add key="MAILUSERPW" value="yyy"/>  
  8.   <!--注意!这是对应服务器邮箱的账号密码-->  
  9. </appSettings>  
最后上一个测试方法,在主函数当中或者Page_Load事件中执行即可:
[csharp] view plaincopy
  1. private void SendEmailExample()  
  2. {  
  3.     MailRequest mail = new MailRequest();  
  4.     mail.Subject = "hello,this is a e-mail sent by asp.net mailhelper.";//主题  
  5.     mail.Body = "hello,this is a e-mail sent by asp.net mailhelper.<a href='http://blog.csdn.net/guwei4037'>欢迎访问我的博客。</a>";//内容  
  6.     mail.Bcc = "512122338@qq.com";//秘密抄送人  
  7.     mail.From = "345822155@qq.com";//发送人  
  8.     mail.CC = "guwei4037@sina.com";//抄送人  
  9.     mail.To = "guwei4037@gmail.com";//收件人  
  10.   
  11.     //读取文件到bytes  
  12.     FileStream stream = new FileStream(Path.Combine(Server.MapPath("~"), "doc\\test.txt"), FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read);  
  13.     byte[] bytes = new byte[stream.Length];  
  14.     stream.Read(bytes, 0, bytes.Length);  
  15.     stream.Close();  
  16.   
  17.     //附件  
  18.     MailRequestAttachments attachments = new MailRequestAttachments();  
  19.     attachments.FileName = "test.txt";  
  20.     attachments.FileData = bytes;  
  21.     mail.Attachments = new MailRequestAttachments[] {   
  22.             attachments  
  23.         };  
  24.   
  25.     string sendMainResult = "-1";  
  26.     if (!string.IsNullOrEmpty(mail.CC.Replace(";""")) && !string.IsNullOrEmpty(mail.To.Replace(";""")))  
  27.     {  
  28.         sendMainResult = MailHelper.SendMail(mail);  
  29.     }  
  30.     Response.Write(sendMainResult);  
  31. }  
发送邮件成功,附件也能正常打开,而且多个用户都收到了电子邮件。截图为证。


源代码下载,请点击这里。

0 0
原创粉丝点击