c#接收邮件类

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值