您的位置:首页 > 编程语言 > C#

一个POP3客户端的C#类

2003-08-22 11:14 477 查看
一个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,

·
4000
  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状态:
AUTHORIZATION
TRANSACTION
UPDATE
。(完整的
POP3
协议定义请参见
RFC 1725)state属性在建立任何与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
方法,就可以开始发送命令了。你将需要调用
USER
PASS
方法以成功登陆服务器,调用其他POP3方法之前必须取得有效的登陆信息。

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

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

历史

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

参看原文:POP3 Client as a C# Class
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息