ASP.NET 2.0 接收邮件

来源:互联网 发布:做淘宝最好的地方 编辑:程序博客网 时间:2024/06/05 16:02

译文去掉了些非技术重点内容,原文地址

介绍

.NET framework 2.0 已经修补了对于通过改良的SMTP类实现发送邮件,但是接收邮件依然没有解决。(在CodeProject上有POP3的各类文章,但是都有一些缺点,类似有些代码没有托管,使用组件,及其有限的功能以及错误报告,没有跟踪服务器命令以及响应,不支持SSL安全套接字层,不支持XML文档,等等。)

这个项目是在以前的项目上建立的,但是完全使用C#2.0。下面首先会看一下从POP3服务器下载未处理的邮件的文章。已经有方法进行连接到POP3服务器,得到现有邮件的列表,请求邮件,删除邮件以及断开链接。为了方便调试以及更专业的使用,提供了扩张错误报告和交互跟踪。之后的文章会将会根据MIME协议将接收合法的邮件分解为内容,附件视图和附件。

我使用Gmail来测试。。。(我用163来测试哦^_^)

 

背景

使用POP3 服务进行交互

通过POP3服务器下载邮件是较为合理和快速的方法。与POP3服务器的交互仅使用一些指令并且方便人们阅读。要建立合法的安全的链接,客户端需要提供用户名以及密码进入POhttp://download1.csdn.net/down3/20070605/05215722221.zipP3事务处理状态,在Pop3MailClient(源码中的类)中称为‘connected’。

在‘connected’状态下,客户端可以执行一下命令:

  • STAT: GetMailboxStats(), 邮件数目和邮箱 number of mails and size of mailbox
  • LIST: GetEmailIdList(), 一个基于话邮件数目和所有邮件大小的列表 a list with session message numbers and size for all emails
  • LIST [msg]: GetEmailSize(), 一封邮件的大小 session message number and size for just one email
  • UIDL: GetUniqueEmailIdList(), 一个具有所有邮件的唯一id号和消息数 a list with unique ID numbers and session message numbers for all emails
  • NOOP: NOOP(), 不操作,只检查服务是否还有效 No operation, just check if server is still alive
  • RETR msg: GetRawEmail(), 得到一封完成的邮件 Retrieve one complete email
  • DELE msg: DeleteEmail(), 给邮件标注为删除Mark one email for deletion once the connection is properly closed.
  • RSET: UndeleteAllEmails(), POP3服务器将为标记的邮件标记为删除 POP3 server deletes umarks the emails marked for deletion
  • QUIT: Disconnect(), 删除需要删除的邮件以及关闭链接 POP3 server deletes emails as needed and closes TCP connection

为了更好的理解,推荐阅读官方的POP3规范, RFC1939 from IETF: Post Office Protocol - Version 3.

错误处理以及跟踪

大量的情况可以使两台通过互联网通信的计算机出现错误。因此,一个稳固的错误报告和通信跟踪是是否必要的。有一些问题,例如服务器没有响应,是致命的并且会抛出一个异常。异常后,通常这个链接就失效了需要被重新建立。 如果这个错误能被POP3客户端代码检测到,一个Pop3Exception(继承自ApplicationException)将会被抛出, 否则将是正常的 .NET 异常。还有一些问题,例如尝试得到一封不存在的邮件,只触发一个警告事件。它取决于用户的POP3客户端代码来决定是否抛出异常还是在日志文件中写一个警告或者……警告之后,POP3服务器将继续接收下一个指令。  

为了更好的调查通信问题,建立了事件跟踪。它展示了POP客户端和服务器端的指令交映,包括了警告。强烈推荐在项目初期使用这个特性,因为RFC1939(规范)给了服务器很大的执行自由度。它们经常提供在跟踪中可见的附加信息。

 

使用代码

服务器设置

我假定服务器的设置类似IP地址等,不会在一次会话中改变。Pop3MailClient类实体的构造函数需要服务器名,端口号,是否需要使用SSL,用户名,密码并且它们不能被更改,如果你想链接一个不同的服务器或者一个不同的用户,需要新建一个Pop3MailClient的实体对象。 

为了是代码运行,你需要输入你自己的用户名、密码。例如:

// TODO: Replace username and password with your own            credentials.Pop3.Pop3MailClient DemoClient =   new Pop3.Pop3MailClient(    "pop.163.com", 110, false, "Username@163.com", "password");

如果你不使用163,当然你需要更改你的服务器名,端口号,用户名密码,设置将useSSL 设为“false”。 

读取原始邮件

方法GetRawEmail范围特定邮件号的完整内容。RFC1939规格,只能使用 ANSI 字符因此 邮件能被简单的显示出来。当然由于一些特殊的字符或者一些编码会使其看起来比较可笑。解码将会是我下一篇关于我的Pop3MimeClient类的文章的一部分。

超时自动重新链接

有时候邮件服务器会断线,链接失效。如果属性isAutoReconnect设置了“ture”,POP3邮件客户端一旦链接超时就会立即尝试链接。这是常有的事情,但是记住这时被标记为删除的邮件不会在服务器上被删除。,

有趣的地方

效率

不翻译了,困了,诶感觉都是对类的解释和描述,下面放出源码(附件吧)大家看看吧,有空在整理源码。

My guess is that the garbage collector spends a considerable amount of time with collecting memory. Receiving email is a lot of text processing and the idea of all these strings created and discarded gives me a creepy feeling. I hear you saying, use Stringbuilders, but they can be even slower than strings if only few operations are executed with them. Isn't it time for some reycling, i.e. reusing the same global StringBuilder for every email received ? I was careful not to indroduce any concurrency problems. But even the Framework itself is not reentrant ! If the repeated use of StringBuffers troubles you, just make them local.

源码下载

 

原创粉丝点击