呼之欲出 WebMail 开发手记 (六) 邮件收取

题外话:首先谢谢各位无论是喜欢我的文章不喜欢我的文章的朋友,有你们的帮助我才会成长。上面两篇文章可能确实没有什么实际的意义,让大家对我的文章有个误解,但我想那是为后面的文章铺路,文章里面的签名也只是防止其他网站的转载,可能大家的想法不一样。我以后的文章还是希望前辈多多批评指正,谢谢。

 

邮件的收发,无非就是使用一些组件,找到自己合适的那就用下去。当然如果技术很不错,可以自己动手分析邮件协议,那是另当别论了。

目前用得比较多的,大概就是  jmail 了。我这里也就使用这个组件进行邮件的收取,邮件的发送就使用 .net 自带的组件了。

只是现在网络可能过于发达了,要的东西找不到,不要的东西一大堆,就拿收邮件来说,一搜索到处就是一样的文章,抄来抄去,抄也就算了,站长也不检查检查,感觉一点没劲,时不时会骂一句:站长真会偷牛!!

 

收发邮件中我们至少需要考虑下面几个因素:

  1. 每个用户有多个邮箱配置信息;
  2. 当前邮箱的收发状态;
  3. 收发邮件异常;
  4. 服务器允许的收发邮件时间间隔。(小于这个时间可能账户会被暂时屏蔽)

首先我们增加一个继承自 IMailThread,IDisposable 的类 MailThread,既然是使用线程收发,那么必须定义的两个变量:

 

private Thread _threadReceive = null;// 收取
private Thread _threadSend = null;// 发送

 

好了,现在我们启动接收邮件线程:

 

Code

 
相信大家已经注意到 BeginReceive 这个家伙了,在这个方法里面,我们首先从数据库中取出当前用户的所有邮箱配置信息,然后依次检查每个邮箱的收取状态,如果正在收取并且距离上一次收取的时间间隔不超过5分钟,就不能再收取。

 

 

BeginReceive


实践证明,jmail 收取的邮件有两个地方必须自己处理一下,才能得到正确的结果。一个是主题,一个是日期,所以我在上一篇中提到了邮件头解码和日期处理的函数:

 

string subject = MailHelper.DecodeStr(message.Headers.GetHeader("Subject"));
string date = MailHelper.ParseDate(message.Headers.GetHeader("Date"));


 

Receive:接收单个邮箱的邮件


其中 dbmail 是邮件系统与数据库打交道的类,在本系列讲完,将提供下载。

请关注我的下一篇文章,并给予支持批评教育,谢谢大家。

posted @ 2009-07-10 20:40  里沃特  阅读(2370)  评论(10编辑  收藏  举报