C#实现收发邮件

/// <summary>
/// 发送邮件
/// </summary>

 1         public void SendMail()
 2         {
 3             string strSmtpServer = "smtp.126.com";  //设置通信服务器
 4             string MailFrom = "zilai_huang@126.com"; //发件人邮箱地址
 5             string MailFromPass = "xxxxxx";
 6             string MailTo = "2984539631@qq.com";  //收件人邮箱地址 
 7             string MailSubject = "XX网站:欢迎注册"; // 邮件主题 
 8             string MailBody = "请勿回复";      // 邮件内容
 9 
10             MailMessage mm = new MailMessage();
11 
12             mm.From = new MailAddress(MailFrom);
13             mm.To.Add(MailTo); // 收件人邮箱地址可以是多个以实现群发 
14             mm.Subject = MailSubject;
15             mm.Body = MailBody;
16             mm.IsBodyHtml = true; // 是否为 HTML 格式 
17             mm.Priority = MailPriority.High; // 发送邮件的优先等级 
18             // 添加邮件附件
19             Attachment attachment = new Attachment(@"c:\\log.txt");
20             mm.Attachments.Add(attachment);
21             mm.BodyEncoding = System.Text.Encoding.UTF8;
22             mm.IsBodyHtml = false; // 是否为html格式 
23             //简单邮件传送协议对象
24             SmtpClient sc = new SmtpClient(strSmtpServer);
25             sc.UseDefaultCredentials = false;
26             // 用于验证发件人身份凭证
27             sc.Credentials = new System.Net.NetworkCredential(MailFrom, MailFromPass);
28             // 电子邮件通过网络发送
29             sc.DeliveryMethod = SmtpDeliveryMethod.Network;
30 
31             try
32             {
33                 sc.Send(mm); //发送邮件 
34                 Console.Write("发送邮件成功");
35             }
36             catch(Exception ex)
37             {
38                 Log4net.saveError(ex.Message);
39                 Console.Write("发送邮件失败");
40             }
41         }
View Code

// 类名:Pop3
// 功能:接收电子邮件

  1     public class Pop3
  2     {
  3         private string mstrHost = null; // 主机名称或IP地址
  4         private int mintPort    = 110;  // 主机的端口号(默认为110)
  5         private TcpClient mtcpClient   = null; //客户端
  6         private NetworkStream mnetStream = null; //网络基础数据流
  7         private StreamReader m_stmReader = null; //读取字节流
  8         private string mstrStatMessage   = null; //执行STAT命令后得到的消息(从中得到邮件数)
  9 
 10         /// <summary>
 11         /// 构造函数
 12         /// </summary>
 13         /// <remarks>一个邮件接收对象</remarks>
 14         public Pop3()
 15         {
 16         }
 17 
 18         /// <summary>
 19         /// 构造函数
 20         /// </summary>
 21         /// <param name="host">主机名称或IP地址</param>
 22         public Pop3(string host)
 23         {
 24             mstrHost = host;
 25         }
 26         
 27         /// <summary>
 28         /// 构造函数
 29         /// </summary>
 30         /// <param name="host">主机名称或IP地址</param>
 31         /// <param name="port">主机的端口号</param>
 32         /// <remarks>一个邮件接收对象</remarks>
 33         public Pop3(string host,int port)
 34         {
 35             mstrHost = host;
 36             mintPort = port;
 37         }
 38 
 39         #region 属性
 40 
 41         /// <summary>
 42         /// 主机名称或IP地址
 43         /// </summary>
 44         /// <remarks>主机名称或IP地址</remarks>
 45         public string HostName
 46         {
 47             get{return mstrHost;}
 48             set{mstrHost = value;}
 49         }
 50 
 51         /// <summary>
 52         /// 主机的端口号
 53         /// </summary>
 54         /// <remarks>主机的端口号</remarks>
 55         public int Port
 56         {
 57             get{return mintPort;}
 58             set{mintPort = value;}
 59         }
 60 
 61         #endregion
 62 
 63         #region 私有方法
 64 
 65         /// <summary>
 66         /// 向网络访问的基础数据流中写数据(发送命令码)
 67         /// </summary>
 68         /// <param name="netStream">可以用于网络访问的基础数据流</param>
 69         /// <param name="command">命令行</param>
 70         /// <remarks>向网络访问的基础数据流中写数据(发送命令码)</remarks>
 71         private void WriteToNetStream(ref NetworkStream netStream,String command)
 72         {
 73             string strToSend = command + "\r\n";
 74             byte[] arrayToSend = System.Text.Encoding.ASCII.GetBytes(strToSend.ToCharArray());
 75             netStream.Write(arrayToSend,0,arrayToSend.Length);
 76         }
 77 
 78         /// <summary>
 79         /// 检查命令行结果是否正确
 80         /// </summary>
 81         /// <param name="message">命令行的执行结果</param>
 82         /// <param name="check">正确标志</param>
 83         /// <returns>
 84         /// 类型:布尔
 85         /// 内容:true表示没有错误,false为有错误
 86         /// </returns>
 87         /// <remarks>检查命令行结果是否有错误</remarks>
 88         private bool CheckCorrect(string message,string check)
 89         {
 90             if(message.IndexOf(check) == -1)
 91                 return false;
 92             else
 93                 return true;
 94         }
 95 
 96         /// <summary>
 97         /// 邮箱中的未读邮件数
 98         /// </summary>
 99         /// <param name="message">执行完LIST命令后的结果</param>
100         /// <returns>
101         /// 类型:整型
102         /// 内容:邮箱中的未读邮件数
103         /// </returns>
104         /// <remarks>邮箱中的未读邮件数</remarks>
105         private int GetMailNumber(string message)
106         {
107             string[] strMessage = message.Split(' ');
108             return Int32.Parse(strMessage[1]);
109         }
110 
111         /// <summary>
112         /// 得到经过解码后的邮件的内容
113         /// </summary>
114         /// <param name="encodingContent">解码前的邮件的内容</param>
115         /// <returns>
116         /// 类型:字符串
117         /// 内容:解码后的邮件的内容
118         /// </returns>
119         /// <remarks>得到解码后的邮件的内容</remarks>
120         private string GetDecodeMailContent(string encodingContent)
121         {
122             string strContent = encodingContent.Trim();
123             string strEncode = null;
124 
125             int iStart = strContent.IndexOf("Base64");
126             if(iStart == -1)
127                 throw new Pop3Exception("邮件内容不是Base64编码,请检查");
128             else
129             {
130                 strEncode = strContent.Substring(iStart + 6,strContent.Length - iStart - 6);
131                 /*
132                 try
133                 {
134                     return SX.Encode.TransformToString(strEncode);
135                 }
136                 catch(SX.EncodeException exc)
137                 {
138                     throw new Pop3Exception(exc.Message);
139                 }
140                  */
141                 return "";
142             }
143         }
144 
145         #endregion
146 
147         /// <summary>
148         /// 与主机建立连接
149         /// </summary>
150         /// <returns>
151         /// 类型:布尔
152         /// 内容:连接结果(true为连接成功,false为连接失败)
153         /// </returns>
154         /// <remarks>与主机建立连接</remarks>
155         public bool Connect()
156         {
157             if(mstrHost == null)
158                 throw new Exception("请提供SMTP主机名称或IP地址!");
159             if(mintPort == 0)
160                 throw new Exception("请提供SMTP主机的端口号");
161             try
162             {
163                 mtcpClient = new TcpClient(mstrHost,mintPort);
164                 mnetStream = mtcpClient.GetStream();
165                 m_stmReader = new StreamReader(mtcpClient.GetStream());
166 
167                 string strMessage = m_stmReader.ReadLine();
168                 if(CheckCorrect(strMessage,"+OK") == true)
169                     return true;
170                 else
171                     return false;
172             }
173             catch(SocketException exc)
174             {
175                 throw new Pop3Exception(exc.ToString());
176             }
177             catch(NullReferenceException exc)
178             {
179                 throw new Pop3Exception(exc.ToString());
180             }
181         }
182 
183         #region Pop3命令
184 
185         /// <summary>
186         /// 执行Pop3命令,并检查执行的结果
187         /// </summary>
188         /// <param name="command">Pop3命令行</param>
189         /// <returns>
190         /// 类型:字符串
191         /// 内容:Pop3命令的执行结果
192         /// </returns>
193         private string ExecuteCommand(string command)
194         {
195             string strMessage = null; //执行Pop3命令后返回的消息
196 
197             try
198             {
199                 //发送命令
200                 WriteToNetStream(ref mnetStream,command);
201 
202                 //读取多行
203                 if(command.Substring(0,4).Equals("LIST") || command.Substring(0,4).Equals("RETR") || command.Substring(0,4).Equals("UIDL")) //记录STAT后的消息(其中包含邮件数)
204                 {
205                     strMessage = ReadMultiLine();
206 
207                     if(command.Equals("LIST")) //记录LIST后的消息(其中包含邮件数)
208                         mstrStatMessage = strMessage;
209                 }
210                 //读取单行
211                 else
212                     strMessage = m_stmReader.ReadLine();
213 
214                 //判断执行结果是否正确
215                 if(CheckCorrect(strMessage,"+OK"))
216                     return strMessage;
217                 else
218                     return "Error";
219             }
220             catch(IOException exc)
221             {
222                 throw new Pop3Exception(exc.ToString());
223             }
224         }
225 
226         /// <summary>
227         /// 在Pop3命令中,LIST、RETR和UIDL命令的结果要返回多行,以点号(.)结尾,
228         /// 所以如果想得到正确的结果,必须读取多行
229         /// </summary>
230         /// <returns>
231         /// 类型:字符串
232         /// 内容:执行Pop3命令后的结果
233         /// </returns>
234         private string ReadMultiLine()
235         {
236             string strMessage = m_stmReader.ReadLine();
237             string strTemp = null;
238             while(strMessage != ".")
239             {
240                 strTemp = strTemp + strMessage;
241                 strMessage = m_stmReader.ReadLine();
242             }
243             return strTemp;
244         }
245 
246         //USER命令
247         private string USER(string user)
248         {
249             return ExecuteCommand("USER " + user) + "\r\n";
250         }
251 
252         //PASS命令
253         private string PASS(string password)
254         {
255             return ExecuteCommand("PASS " + password) + "\r\n";
256         }
257 
258         //LIST命令
259         private string LIST()
260         {
261             return ExecuteCommand("LIST") + "\r\n";
262         }
263 
264         //UIDL命令
265         private string UIDL()
266         {
267             return ExecuteCommand("UIDL") + "\r\n";
268         }
269 
270         //NOOP命令
271         private string NOOP()
272         {
273             return ExecuteCommand("NOOP") + "\r\n";
274         }
275 
276         //STAT命令
277         private string STAT()
278         {
279             return ExecuteCommand("STAT") + "\r\n";
280         }
281 
282         //RETR命令
283         private string RETR(int number)
284         {
285             return ExecuteCommand("RETR " + number.ToString()) + "\r\n";
286         }
287 
288         //DELE命令
289         private string DELE(int number)
290         {
291             return ExecuteCommand("DELE " + number.ToString()) + "\r\n";
292         }
293 
294         //QUIT命令
295         private void Quit()
296         {
297             WriteToNetStream(ref mnetStream,"QUIT");
298         }
299 
300         /// <summary>
301         /// 收取邮件
302         /// </summary>
303         /// <param name="user">用户名</param>
304         /// <param name="password">口令</param>
305         /// <returns>
306         /// 类型:字符串数组
307         /// 内容:解码前的邮件内容
308         /// </returns>
309         private string[] ReceiveMail(string user,string password)
310         {
311             int iMailNumber = 0; //邮件数
312 
313             if(USER(user).Equals("Error"))
314                 throw new Pop3Exception("用户名不正确!");
315             if(PASS(password).Equals("Error"))
316                 throw new Pop3Exception("用户口令不正确!");
317             if(STAT().Equals("Error"))
318                 throw new Pop3Exception("准备接收邮件时发生错误!");
319             if(LIST().Equals("Error"))
320                 throw new Pop3Exception("得到邮件列表时发生错误!");
321 
322             try
323             {
324                 iMailNumber = GetMailNumber(mstrStatMessage);
325 
326                 //没有新邮件
327                 if(iMailNumber == 0)
328                     return null;
329                 else
330                 {
331                     string[] strMailContent = new string[iMailNumber];
332 
333                     for(int i = 1 ; i <= iMailNumber ; i++)
334                     {
335                         //读取邮件内容
336                         strMailContent[i - 1] = GetDecodeMailContent(RETR(i));
337                     }
338                     return strMailContent;
339                 }
340             }
341             catch(Pop3Exception exc)
342             {
343                 throw new Pop3Exception(exc.ToString());
344             }
345         }
346 
347         #endregion
348         
349         /// <summary>
350         /// 收取邮件     
351         /// </summary>
352         /// <param name="user">用户名</param>
353         /// <param name="password">口令</param>
354         /// <returns>
355         /// 类型:字符串数组
356         /// 内容:解码前的邮件内容
357         /// </returns>
358         ///<remarks>收取邮箱中的未读邮件</remarks>
359         public string[] Receive(string user,string password)
360         {
361             try
362             {
363                 return ReceiveMail(user,password);
364             }
365             catch(Pop3Exception exc)
366             {
367                 throw new Pop3Exception(exc.ToString());
368             }
369         }
370 
371         /// <summary>
372         /// 断开所有与服务器的会话
373         /// </summary>
374         /// <remarks>断开所有与服务器的会话</remarks>
375         public void DisConnect()
376         {
377             try
378             {
379                 Quit();
380                 if(m_stmReader != null)        m_stmReader.Close();
381                 if(mnetStream != null)        mnetStream.Close();
382                 if(mtcpClient != null)        mtcpClient.Close();
383             }
384             catch(SocketException exc)
385             {
386                 throw new Pop3Exception(exc.ToString());
387             }
388         }
389 
390         /// <summary>
391         /// 删除邮件
392         /// </summary>
393         /// <param name="number">邮件号</param>
394         public void DeleteMail(int number)
395         {
396             //删除邮件
397             int iMailNumber = number + 1;
398             if(DELE(iMailNumber).Equals("Error"))
399                 throw new Pop3Exception("删除第" + iMailNumber.ToString() + "时出现错误!");
400         }
401 
402     }
View Code

 

posted @ 2014-08-12 21:32  壬子木  阅读(276)  评论(0)    收藏  举报