使用Flash AS3 Sokect 连接IMAP服务器检查新邮件

首先感谢Adobe大神提供的as3 sokect利器。其次感谢IMAP服务可以直接得到邮件的状态。最后感谢我的老婆……

在开始之前首先对IMAP做一些了解。

Internet Mail Access Protocol(交互式邮件存取协议)IMAP是斯坦福大学在1986年开发的研发的一种邮件获取协议。它的主要作用是邮件客户端(例如MS Outlook Express)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。

IMAP比较酷的功能是对每一封邮件都有标识。已读、未读、新旧邮件等。所以我们可以通过检查邮件的标识来检测新邮件(或则未读)了!

以往老式做法是将邮件列表下载储存,然后与服务器上的邮件列表做对比,发现不同则视为新邮件。有了IMAP就完全轻松了。只需要输入命令即刻得到新邮件,或者标记为未读的邮件。

现在我们首先通过CMD(命令提示符)来连接支持IMAP服务器的邮件服务器。检查一下邮件状态。熟悉一下后边需要用到的IMAP命令。

首先点击Windows开始->运行->cmd 调出黑漆漆的命令提示符。

在这个操作中,我们需要使用cmd的telnet命令。

如果您是win7系统。cmd默认没有打开telnet功能。你需要首先打开telnet功能。进行如下操作:

  1. 打开win7控制面板。
  2. 点击程序
  3. 点击打开或关闭windows功能
  4. 点选Telnet客户端。
  5. 确定退出即可开启win7命令提示符的telnet功能

我们在命令提示符里来试一下连接QQ邮箱的IMAP服务器!

telnet imap.qq.com 143 //telnet+连接地址+端口号

为什么你知道qq的imap服务器连接地址是imap.qq.com?这样问的同学先蹲墙角晿一百遍国歌再往下看。

马上见到回应:

* OK [CAPABILITY IMAP4 IMAP4rev1 AUTH=LOGIN NAMESPACE] QQMail IMAP4Server ready

好,连接成功。让我们登录吧:

A1 login 38657783@qq.com wodemima //命令编号+命令+账户+密码

这里请注意,一定要输入一个命令编号。否则IMAP服务器将无法识别你的命令。据说这是为了有一个良好的反馈。命令执行之后,IMAP会返回命令编号执行的结果。比如上边的指令会返回:

A1 OK Success login ok //编号为A1的命令执行结果是 OK 成功登入

登入之后,我们来检查一下我的邮箱都有哪些文件夹。

A2 list "" * //列出所有文件夹

结果我就不贴了,反正可定有一个名字为INBOX的文件夹,这就是收件箱。检查新邮件当然是进入INBOX了:

A3 select inbox //选择名字为inbox的文件夹

返回结果也比较多,我就不贴了。然后来检查新邮件:

A4 search new //查找新邮件

返回结果:

* SEARCH 92     //找到了一个标号92的新邮件
A4 OK SEARCH completed  //编号A4命令执行完毕

这里我也要在特殊说明一下。其实新邮件这个属性比较怪异,有的IMAP服务器只要你检索过一次或者操作过一次新邮件,那下一次就不会把它当作新邮件了。如果我们想做到与邮箱同步,那么我建议把新邮件的概念转移到未读邮件。

这样只要邮箱里表示未读邮件的,我们都认为他是新邮件。这样可能更加可控一些。最重要的是我们可以在后边的调试中不用频繁的发邮件了。

那么未读邮件如何查找?

A5 SEARCH UNSEEN  //查找标记为unseen的邮件。

返回结果:

* SEARCH 92 //找到编号为92的未读邮件一封
A5 OK SEARCH completed //编号A5的命令执行完毕

这样我们已经看到了一封未读的邮件。只需要用正则表达式来找出SEARCH之后和换行之前的数字个数,即是新邮件数。

你要是感兴趣还可以查一下 SEEN 已读邮件。IMAP还有很多很强大的命令,比如FETCH、FLAGS等等。但是我们这里就不一一测试了。感兴趣的朋友可以自己找来玩。我们最终目的是检查新邮件(未读邮件)。

好,使用CMD来玩一下IMAP到这里结束。现在来看一下如何使用Flash AS3 用Sokect连接IMAP检查邮件。

打开CS5,新建一个as3的文档。保存为test.fla。在fla的属性填写文档类为test。点击旁边的烂笔头,flash会为我们生成一个文档类。另存到同级目录下。名字为test.as。如下图:

生成文档类
生成文档类

首先来写入trace()检查是否正常。文档类内容如下:

package
{
	import flash.display.MovieClip;
	/**
	 * woria2010
	 * @author Space.As
	 * demo 文档类
	 */
	public class test extends MovieClip
	{

		public function test()
		{
			trace("hi, as1984!");
		}
	}
}

ctrl+enter之后看到输出面板“hi,as1984!”。说明一切正常。现在开始连接imap吧。

这里我们需要引入的包如下:

import flash.display.MovieClip; //文档类继承mc 不引入这个包不是搞笑么。
import flash.net.Socket; //socket包。用它来连接imap呢。
import flash.events.Event;//时间。注册监听
import flash.events.ProgressEvent;//当返回信息发生改变时
import flash.utils.ByteArray;//读取服务器返回信息需要用到它。

然后我们需要定义几个对象和变量方便操作。

private var sa_url:String="imap.qq.com"; //服务器连接地址
private var sa_port:uint=143;//端口号
private var sa_sockect:Socket;//socket对象
private var message:String;//服务器返回信息。

我们在构造函数中首先实例化socket对象,然后连接服务器。注册socket实例的监听。

sa_sockect=new Socket();
sa_sockect.connect(sa_url,sa_port);//开始连接
sa_sockect.addEventListener(Event.CONNECT, scConnectHandler);//成功连接上
sa_sockect.addEventListener(ProgressEvent.SOCKET_DATA, scDataHandler);//接受数据

然后添加两个监听函数。一个用于检查连接成功。一个用于输出服务器返回信息。其实我们还应该注册更多的时间监听。比如:连接失败。安全问题引起的异常等等。我们这里只注册这两个监听。函数如下:

public function scConnectHandler(e:Event):void {
         trace("Sockect已连接,正在尝试登陆,请稍等..");
         var ba:ByteArray = new ByteArray();//生成二进制对象准备写入socket指令
         ba.writeMultiByte("A0 login 38657783@qq.com  *******" + "\n", "UTF-8");//写入登陆指令,请把***替换成你的密码
         sa_sockect.writeBytes(ba);//写入
         sa_sockect.flush();//发送
}
public function scDataHandler(e:ProgressEvent):void {
         var socket:Socket = e.target as Socket //移花接木找到sokect对象,其实这里可以直接用sa_sockect一样的。
         message = socket.readUTFBytes( socket.bytesAvailable );//按照二进制来读取信息到message
         trace(message);//输出
}

然后来ctrl+enter看一下结果吧。
嗯!输入面板有内容了:

hi,as1984!
Sockect已连接,正在尝试登陆,请稍等..
* OK [CAPABILITY IMAP4 IMAP4rev1 AUTH=LOGIN NAMESPACE] QQMail IMAP4Server ready

A0 OK Success login ok

说明我们已经通过flash连上IMAP了。
那现在我们需要做的就是来读取新旧邮件吗?应该还不可以。我们要做一些状态判断。例如登陆成功。登录失败。连接 失败。等等。

所以我们还需要设计添加一些辅助对象,变量等,来确定是否连接成功,登陆成功等等。

One comment Add yours

发表回复