首先感谢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功能。进行如下操作:
- 打开win7控制面板。
- 点击程序
- 点击打开或关闭windows功能
- 点选Telnet客户端。
- 确定退出即可开启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了。
那现在我们需要做的就是来读取新旧邮件吗?应该还不可以。我们要做一些状态判断。例如登陆成功。登录失败。连接 失败。等等。
所以我们还需要设计添加一些辅助对象,变量等,来确定是否连接成功,登陆成功等等。
挺给力。。