一个POP3客户端的C#类

原创 2003年08月22日 11:14:00

一个POP3客户端的C#类<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

作者: Bill Dean

关键词: C#, VB.NET,.NET, INTERNET

提交: 2002-02-26

更新: 2003-08-06

 

摘要: 本文描述的是一个实现了标准POP3命令的C#类。

 

·                     下载源文件 - 2 Kb

·                     下载演示程序- 5 Kb

·                     下载VB.NET版本源文件(Ronny Reinertsen)

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

示例程序执行结果

简介

读完Agus Kurniawan关于用C#POP3服务器通讯的文章,我决定如果建立一个POP3客户端的类的话,我将走得更远。我决定为每一个标准的POP3命令实现方法,每一个方法返回一个包含(相应的)POP3服务器响应的字符串,某些情况命令无效,那么这些方法检查这些错误并且返回一个错误信息而不是直接发送命令到服务器。随文的源文件包含类的定义和一个使用该类与POP3邮件服务器通信的控制台演示程序(前面列出)。

类,方法和属性

随附的源代码包含一个类: POP3Client

      POP3Client类包含十个公用方法,其中九个代表标准的POP3命令:

·  DELE,

·  LIST,

·  NOOP,

·  PASS,

·  QUIT,

·  RETR,

·  RSET,

·  STAT

·  and USER

 

      每一个"POPmethods"返回一个字符串,内容为(相应的)POP3服务器响应结果,或者不恰当的命令导致的错误信息。最后一个公用方法:connect用来初始化连结。没有实现可选的POP3命令:APOP, TOP and UIDL

      开始工作后不久,我认识到所有POP3方法应该按以下四个基本步骤实现:

1.      检查该命令载当前的POP状态中是否有效。

2.      如果有效,发送命令到服务器。

3.      读取响应结果。

4.      (如果需要)改变POP状态。

      我决定用一个叫state的属性来跟踪POP会话的当前状态,数据类型声明为connect_state的枚举类型。你们可以看到这些声明在类的定义的顶部。


      有三个POP状态:AUTHORIZATIONTRANSACTIONUPDATE。(完整的POP3协议定义请参见RFC 1725state属性在建立任何与POP3服务器的连接之前被设为disc(断开),建立连接后变为AUTHORIZATION

I also thought it would be useful to store the user name, password, pop server name and error state (i.e.: did an error occur on the last POP3 command), so I add these properties to the class:

      我也认为保存用户名、密码、POP3服务器名和错误状态是有用的(例如:判断上一个POP3命令是否发生错误),所以我在类中加入了这些属性:


      连接服务器(TcpClient)、发送(NetworkStream)和接收数据(StreamReader)的机制直接取自Agus的代码。我甚至保留了相同的变量名:


      在做任何其他工作之前,我们需要建立道服务器的连接以及取得网络流中的信息。这个在connect公用方法中进行。

      注意:只要连接一初始化,会话就进入了AUTHORIZATION状态。

      正如前面所提到的,九个POP3方法实质上具有相同的结构。DELE方法的源代码展示出该结构。

      首先,我们知道DELE POP3命令只在TRANSACTION状态有效,所以如果该类不在这个状态,查看记录在state属性的值,那么返回一个错误信息而不是发送请求到POP3服务器。当处于别的状态时发送DELE命令也不会损伤POP3服务器,只是会产生内部的错误信息而已。如果你宁可让POP3服务器产生状态的错误信息,尽可移出if结构只留下issue_command()调用。一旦确定POP会话处于正确的状态,我们就使用私有方法issue_command发送"DELE"命令到服务器。RFC 1725描述了DELE命令返回一个从服务器发回的单行响应,我们用方法read_single_line_response来读取。两个方法都相当直接明了,不管是向建立连结的服务器写字符还是从建立连结的服务器读取来自于网络流的字符。因为执行完DELE命令后POP会话状态仍为TRANSACTION状态,我们没必要担心要改变state值。state改变的例子请参见源代码的PASS方法。

注意,在某些情况,有些POP3命令返回多行响应。这里也采用一个名叫read_multi_line_response的方法来处理。我前面已经提到过,我认为显示地判断最后一个POP命令是否正确执行,或者POP3服务器是否返回错误,将是有用的。这里用was_pop_error私有方法来检查。

使用示例

      POP3协议的细节有点超出本文章的范围。所以如果你想多了解POP3的话,我建议你去RFC 1725,你可以在这里找到。让我们简单的看一下示例程序,以便了解怎样使用这个类:

static void Main(string[] args)

      总之,你创建一个POP3Client类的实例,用你的POP3服务器调用connect方法,就可以开始发送命令了。你将需要调用USERPASS方法以成功登陆服务器,调用其他POP3方法之前必须取得有效的登陆信息。

      我希望你们部分人发觉这篇文章是有用的。我也希望收到反馈或建议。

      请大家明白该代码没有任何的保证,不管是明示还是暗示。该代码严格的“无保证”提供,仅仅为教育目的。谁使用谁负责。要使用该代码,请允诺使用该代码带来的任何损失与作者和Restek无关。

历史

  • 2003-08-06 —— Ronny Reinertsen好意地把C#版本转为VB.NET

                                                    (完)

参看原文:POP3 Client as a C# Class

C# POP3、IMAP、SMTP收发邮件

using System; using System.Collections.Generic; using System.Linq; using System.Text; using Lesnikow...
  • u012725119
  • u012725119
  • 2013年11月21日 19:17
  • 2494

C#通过POP3获取邮件(正文和附件)

使用方法:  获取第1封邮件            Zgke.Net.POP3 _Popt = new Zgke.Net.POP3("192.168.0.1", 110);            Da...
  • zgke
  • zgke
  • 2010年02月22日 10:10
  • 10429

C# pop3实现的收邮件

 C# pop3实现的收邮件东西写的不太清楚  可以显示邮件正文  标题  发件人,及邮件数,删除邮件!含有DecodeBase64和quoted-printable  解码 using System...
  • kurt520
  • kurt520
  • 2008年01月23日 16:14
  • 451

C# POP3编程

POP3的使用很简单,所以.net没有向SMTP那样给出相应的类来控制. 废话少说,程序员最需要的使代码,:)! 1.打开VS.NET 2003. 2.新建一个WinForm Application....
  • 21aspnet
  • 21aspnet
  • 2007年03月24日 15:49
  • 3325

C#实现POP3邮件接收程序

来自:http://outofmemory.cn/code-snippet/2409/C-achieve-POP3-email-receive-program 本文通过运用C#来实现一个基于...
  • ArvinStudy
  • ArvinStudy
  • 2013年03月08日 11:41
  • 2814

详图解-用C#从POP3服务器取得邮件(提供源代码下载)

Download source files - 6 Kb Download demo project - 4 Kb IntroductionIn this article, Ill s...
  • metababy
  • metababy
  • 2006年01月18日 17:15
  • 2074

C#客户端的异步操作

阅读目录 开始示例项目介绍同步调用服务异步接口介绍1. 委托异步调用2. 使用IAsyncResult接口实现异步调用3. 基于事件的异步调用模式4. 创建新线程的异步方式5. 使用线程池的异步...
  • linybo
  • linybo
  • 2015年04月11日 22:25
  • 335

c#中邮件收发处理(POP3,IMAP,SMTP)

来源: 随心所欲 - 博客园  本文涉及的内容:  1:自己制作Pop3Helper  信件格式的处理有麻烦  2:使用现成的pop3类  LumiSoft.Net.POP3.Client;   有两...
  • lovewiyi
  • lovewiyi
  • 2007年10月19日 21:39
  • 975

c# 获取客户端的 mac

WMI Scripting HTML  document.forms[0].txtMACAddr.value=unescape(MACAddr);  document.forms[0].t...
  • dingxingmei
  • dingxingmei
  • 2013年01月21日 13:16
  • 399

java设计模式——创建型之原型模式

Prototype Pattern(原型模式)
  • zyfzjsc988
  • zyfzjsc988
  • 2016年03月08日 10:18
  • 443
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个POP3客户端的C#类
举报原因:
原因补充:

(最多只允许输入30个字)