C#利用System.Net发送邮件(带 抄送、密送、附件、html格式的邮件)

  net2.0后,C#可以利用System.Net发送邮件了。

  代码整理如下:

  1 /**************************************
  2  * <copyright file="SendEail.cs">
  3  * Copyright(c)2014 LeeStudio All rights reserved.
  4  * CLR版本:4.0.30319.17929
  5  * 开发团队:欺心伴月个人工作室
  6  * 技术博客:http://www.cnblogs.com/lichunyang/
  7  * 所属工程:LeeStudio.Basic
  8  * 创 建 者:Frank Lee
  9  * 修改时间:2014-02-20 11:20
 10  * </copyright>
 11 **************************************/
 12 
 13 using System;
 14 using System.Text;
 15 using System.Net;
 16 using System.Net.Mail;
 17 using System.Net.Mime;
 18 
 19 namespace LeeStudio.Basic
 20 {
 21     /// <summary>
 22     /// 邮件发送类
 23     /// </summary>
 24     public class SendEmail
 25     {
 26         private MailMessage mailMessage = new MailMessage(); //实例化一个邮件类
 27 
 28         #region 构造函数
 29         /// <summary>
 30         /// 构造函数
 31         /// </summary>
 32         /// <param name="toAddresses">收件人地址(多个以,号分开)</param>
 33         /// <param name="fromAddress">发件人地址</param>
 34         /// <param name="title">主题</param>
 35         /// <param name="body">正文</param>
 36         public SendEmail(string toAddresses, string fromAddress, string title, string body)
 37             : this(toAddresses, fromAddress, "", "", title, body, false)
 38         {
 39         }
 40 
 41         /// <summary>
 42         /// 构造函数
 43         /// </summary>
 44         /// <param name="toAddress">收件人地址</param>
 45         /// <param name="fromAddress">发件人地址</param>
 46         /// <param name="toName">收件人名字</param>
 47         /// <param name="fromName">发件人姓名</param>
 48         /// <param name="title">主题</param>
 49         /// <param name="body">正文</param>
 50         /// <param name="isBodyHtml">正文是否为html格式</param>
 51         public SendEmail(string toAddress, string fromAddress, string toName, string fromName, string title, string body, bool isBodyHtml)
 52         {
 53             mailMessage.From = new MailAddress(fromAddress, fromName, Encoding.GetEncoding(936));
 54             if (toName.Equals(""))
 55                 mailMessage.To.Add(toAddress);
 56             else
 57                 mailMessage.To.Add(new MailAddress(toAddress, toName, Encoding.GetEncoding(936)));
 58 
 59             mailMessage.Subject = title;
 60             mailMessage.SubjectEncoding = Encoding.GetEncoding(936);
 61 
 62             mailMessage.Body = body;
 63             mailMessage.IsBodyHtml = isBodyHtml;
 64             mailMessage.BodyEncoding = Encoding.GetEncoding(936);
 65         }
 66         #endregion
 67 
 68         /// <summary>
 69         /// 设置SMTP,并且将邮件发送出去
 70         /// 所有参数都设置完成后再调用该方法
 71         /// </summary>
 72         /// <param name="password">发件人密码</param>
 73         /// <param name="smtpHost">SMTP服务器地址</param>
 74         public void SetSmtp(string password, string smtpHost)
 75         {
 76             SetSmtp(mailMessage.From.Address, password, smtpHost, 25, false, MailPriority.Normal);
 77         }
 78 
 79         /// <summary>
 80         /// 设置SMTP,并且将邮件发送出去
 81         /// 所有参数都设置完成后再调用该方法
 82         /// </summary>
 83         /// <param name="address">发件人地址(必须为真实有效的email地址)</param>
 84         /// <param name="password">发件人密码</param>
 85         /// <param name="smtpHost">SMTP服务器地址</param>
 86         /// <param name="smtpPort">SMTP服务器的端口</param>
 87         /// <param name="isEnableSsl">SMTP服务器是否启用SSL加密</param>
 88         /// <param name="priority">邮件的优先级</param>
 89         public void SetSmtp(string address, string password, string smtpHost, int smtpPort, bool isEnableSsl, MailPriority priority)
 90         {
 91             SmtpClient smtp = new SmtpClient();
 92             smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
 93             smtp.Credentials = new NetworkCredential(address, password);
 94             smtp.Host = smtpHost;
 95             smtp.Port = smtpPort;
 96             smtp.EnableSsl = isEnableSsl;
 97 
 98             mailMessage.Priority = priority;
 99             smtp.Send(mailMessage); //发送邮件
100         }
101 
102         #region //设置邮件地址
103         /// <summary>
104         /// 设置更多收件人
105         /// </summary>
106         /// <param name="toAddresses">收件人地址</param>
107         public void SetMoreToAddress(string toAddresses)
108         {
109             mailMessage.To.Add(toAddresses);
110         }
111 
112         /// <summary>
113         /// 设置更多收件人
114         /// </summary>
115         /// <param name="toAddresses">收件人地址</param>
116         /// <param name="toName">收件人名字</param>
117         public void SetMoreToAddress(string toAddress, string toName)
118         {
119             mailMessage.To.Add(new MailAddress(toAddress, toName, Encoding.GetEncoding(936)));
120         }
121 
122         /// <summary>
123         /// 设置抄送者(多个以,号分开)
124         /// </summary>
125         /// <param name="ccAddresses">抄送者地址</param>
126         public void SetCarbonCopyFor(string ccAddresses)
127         {
128             mailMessage.CC.Add(ccAddresses);
129         }
130 
131         /// <summary>
132         /// 设置抄送者
133         /// </summary>
134         /// <param name="ccAddress">抄送者地址</param>
135         /// <param name="ccName">抄送者名字</param>
136         public void SetCarbonCopyFor(string ccAddress, string ccName)
137         {
138             mailMessage.Bcc.Add(new MailAddress(ccAddress, ccName, Encoding.GetEncoding(936)));
139         }
140 
141         /// <summary>
142         /// 设置密送者(多个以,号分开)
143         /// </summary>
144         /// <param name="bccAddresses">密送者</param>
145         public void SetBlindCarbonCopyFor(string bccAddresses)
146         {
147             mailMessage.Bcc.Add(bccAddresses);
148         }
149 
150         /// <summary>
151         /// 设置密送者
152         /// </summary>
153         /// <param name="bccAddress">密送者</param>
154         /// <param name="bccName">密送者名字</param>
155         public void SetBlindCarbonCopyFor(string bccAddress, string bccName)
156         {
157             mailMessage.Bcc.Add(new MailAddress(bccAddress, bccName, Encoding.GetEncoding(936)));
158         }
159         #endregion
160 
161         #region 添加附件
162         /// <summary>
163         /// 添加附件(自动识别文件类型)
164         /// </summary>
165         /// <param name="fileName">单个文件的路径</param>
166         public void Attachments(string fileName)
167         {
168             mailMessage.Attachments.Add(new Attachment(fileName));
169         }
170 
171         /// <summary>
172         /// 添加附件(默认为富文本RTF格式)
173         /// </summary>
174         /// <param name="fileName">单个文件的路径</param>
175         public void AttachmentsForRTF(string fileName)
176         {
177             mailMessage.Attachments.Add(new Attachment(fileName, MediaTypeNames.Application.Rtf));
178         }
179         #endregion
180     }
181 }

  调用是按照需求,*设置参数。

 1 using LeeStudio.Basic;
 2 
 3 private void SendEmail()
 4 {
 5     #region 最简设置
 6     //SendEmail se = new SendEmail("*****@****.com", "****@163.com", "title", "body");
 7     //se.SetSmtp("password", "smtp.163.com"); //必须在所有参数设置完后调用此方法
 8     #endregion
 9 
10     #region 完全设置
11     //string toAddresses = "***@**.**,***@**.**";
12     //string toNames = "frank,lee";
13 
14     //SendEmail se = new SendEmail("to@**.**", "from@**.**", "toname", "fromname","title", "body", false);
15     //se.SetMoreToAddress("to@**.**", "toName");
16     //se.SetCarbonCopyFor("cc@**.**");
17     //se.SetBlindCarbonCopyFor("bcc@**.**");
18 
19     //string filePath = Request.PhysicalApplicationPath + "/file/SendEmail.txt";
20     //se.Attachments(filePath);
21     //filePath = Request.PhysicalApplicationPath + "/file/RTF文件.docx";
22     //se.AttachmentsForRTF(filePath);
23     //se.SetSmtp("email", "password", "smtp", 25, true, System.Net.Mail.MailPriority.Normal); //必须在所有参数设置完后调用此方法
24     #endregion
25 }

  遗留问题:

  当有多个收件人/抄送者/密送者时,如何快速处理?之前的做法是让用户输入字符串,再将字符串一一对应匹配,代码如下:

 1 /// <summary>
 2 /// 将邮件地址和名称加入到锯齿数组中
 3 /// </summary>
 4 /// <param name="addrs">邮件地址(多个以,号分开)</param>
 5 /// <param name="names">名称(多个以,号分开)</param>
 6 /// <returns>地址和名称数组</returns>
 7 private string[][] SetNameList(string addrs, string names)
 8 {
 9     string[][] result = new string[2][];
10 
11     string[] addr = addrs.Split(',');
12     string[] name = names.Split(',');
13     result[0] = new string[addr.Length];
14     result[1] = new string[name.Length];
15 
16     for (int i = 0; i < addr.Length; i++)
17         result[0][i] = addr[i];
18     for (int i = 0; i < name.Length; i++)
19         result[1][i] = name[i];
20 
21     return result;
22 }

  首先这个方法就很奇葩,其次,只要用户输入的个数不对应,又要做一堆的异常处理……

  

  有好的方法望不吝赐教。