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 }
// 类名: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 }

浙公网安备 33010602011771号