首页 »编程综合 » thunderbird:基于Mozilla ThunderBird的扩展开发( 3)---如何获取邮件的完整信息 »正文
thunderbird:基于Mozilla ThunderBird的扩展开发( 3)---如何获取邮件的完整信息
来源: 发布时间:星期四, 2009年1月15日 浏览:35次 评论:0
如果你没有读过ThunderBird ![](/icons/50861de.gif) 源代码 ![](/icons/50861dou.gif) 也许会和我 ![](/icons/50861yi.gif) 样想当然地认为里面肯定有某个数据结构用于存储邮件 ![](/icons/50861de.gif) 正文和附件等信息 ![](/icons/50861dou.gif) 但如果你读过了代码 ![](/icons/50861dou.gif) 那么也会和我 ![](/icons/50861yi.gif) 样感到遗憾 ![](/icons/50861dou.gif) 居然没有这样完整 ![](/icons/50861de.gif) 数据结构!里面有 ![](/icons/50861yi.gif) 个表示邮件头 ![](/icons/50861de.gif) XPCOM 组件 nsIMsgHdr ![](/icons/50861dou.gif) 但mozilla这帮人却没有定义 ![](/icons/50861yi.gif) 个用来表示邮件(包括邮件头 ![](/icons/50861dou.gif) 正文 ![](/icons/50861dou.gif) 附件等信息) ![](/icons/50861de.gif) 组件” nsIMsg”呢 ![](/icons/50861dou.gif) 问题更进 ![](/icons/50861yi.gif) 步 ![](/icons/50861dou.gif) 你会发现它里面采用了 ![](/icons/50861yi.gif) 个gDBView ![](/icons/50861dou.gif) ![](/icons/50861yi.gif) 个msgWindow,这两个对象 ![](/icons/50861de.gif) 具体含义这里就不多说了 ![](/icons/50861dou.gif) 反正是让我们想获取到邮件 ![](/icons/50861de.gif) 完整信息这件事更加困难了 ![](/icons/50861dou2.gif) 好 ![](/icons/50861de.gif) ![](/icons/50861dou.gif) 那我现在就要结合自己 ![](/icons/50861de.gif) 实际开发讲解下如何去获取指定邮件 ![](/icons/50861de.gif) 完整信息了 ![](/icons/50861dou.gif) let’s go! 首先要明确 ![](/icons/50861de.gif) 是你要获取 ![](/icons/50861de.gif) 邮件是离线 ![](/icons/50861de.gif) (存储在本地)还是在线 ![](/icons/50861de.gif) (在服务器上) ![](/icons/50861dou.gif) 要实现这个判断 ![](/icons/50861dou.gif) 我们可以用如下代码: (mail.folder.hasMsgOffline(mail.messageKey)) { readOffline(mail);//从本地读 } { readOnline(mail);//从服务器读 }
如果邮件在本地 ![](/icons/50861dou.gif) 我们可以直接让它所在 ![](/icons/50861de.gif) 文件夹给我们 ![](/icons/50861yi.gif) 个代表整个邮件 ![](/icons/50861de.gif) 输入流对象 ![](/icons/50861dou.gif) 要完成这个工作 ![](/icons/50861dou.gif) 你得创建 ![](/icons/50861yi.gif) 个nsIInputStream ![](/icons/50861dou.gif) 它 ![](/icons/50861de.gif) 作用是用来“包含”邮件信息 ![](/icons/50861dou.gif) nsIMsgFolder ![](/icons/50861de.gif) getOfflineFileStream思路方法可以返回这样 ![](/icons/50861yi.gif) 个流对象 ![](/icons/50861dou.gif) 这个思路方法有 ![](/icons/50861yi.gif) 个输入参数(表示邮件key),两个输出参数. function readOffline(mail) { var key = mail.messageKey; var off = Object ; var messageSize = Object ; var is; var bodyAndHdr; try{ is = mail.folder.getOfflineFileStream(key,off ,messageSize); } catch(e){ alert("message: "+e.message); } try{ var sis = factory.createInstance( Components. erfaces.nsIScriptableInputStream ); sis.init(is); bodyAndHdr = sis.read(mail.messageSize); sis.close ; is.close ; } catch(e){ alert("message: "+e.message); } doSomethingWith(bodyAndHdr); }
如果你要在线读取邮件 ![](/icons/50861dou.gif) 那就有点复杂了 ![](/icons/50861dou.gif) ![](/icons/50861yinwei.gif) 你得让IMAP服务器端告诉你邮件 ![](/icons/50861de.gif) 信息 ![](/icons/50861dou.gif) 而这是 ![](/icons/50861yi.gif) 个异步 ![](/icons/50861de.gif) 事件 ![](/icons/50861dou.gif) 也就是你发出指令 ![](/icons/50861dou.gif) 然后等待来自服务器 ![](/icons/50861de.gif) 反馈信息 ![](/icons/50861dou2.gif) 因此你得监听来自服务器端 ![](/icons/50861de.gif) 反馈信息 ![](/icons/50861dou2.gif) 首先 ![](/icons/50861dou.gif) 我们获取邮件 ![](/icons/50861de.gif) URI,这可以通过其所在 ![](/icons/50861de.gif) 文件夹获得 ![](/icons/50861dou.gif) 然后我们查找邮件服务提供者---IMAP,POP等 ![](/icons/50861dou.gif) 让它来处理邮件信息: function readOnline(folder, mail) { var key = mail.messageKey; var uri = mail.folder.generateMessageURI(key); var messenger = Components. es['@mozilla.org/messenger;1'] .createInstance ; messenger = messenger.QueryInterface( Components. erfaces.nsIMessenger ); var messageService = messenger.messageServiceFromURI(uri);//邮件服务提供者 ok,现在我们已经有 ![](/icons/50861yi.gif) 个处理邮件URI ![](/icons/50861de.gif) 邮件服务提供者了 ![](/icons/50861dou.gif) 接下来就可以通过它 ![](/icons/50861yi.gif) 个思路方法CopyMessage来从服务器端获取邮件了 ![](/icons/50861dou.gif) 并且可以将邮件放入 ![](/icons/50861yi.gif) 个输入流中 ![](/icons/50861dou.gif) 从而使得我们可以传入 ![](/icons/50861yi.gif) 个nsIStreamListener来监听这个输入流是否有数据到来 ![](/icons/50861dou2.gif) var aurl = Object ; messageService.CopyMessage(uri, myStreamListener, false, null, msgWindow, aurl); } 输入流监听器会负责处理来自服务器端 ![](/icons/50861de.gif) 数据 ![](/icons/50861de.gif) : var myStreamListener = { _disibledevent= sis.read(count); } catch(ex) { alert("exception caught: "+ex.message+"n"); } }, onStartRequest: function(request, context) { }, onStopRequest: function(aRequest, aContext, aStatusCode) { doSomethingWith(bodyAndHdr); } }; onDataAvailable ![](/icons/50861hanshu.gif) 会 ![](/icons/50861yi.gif) 直被 ![](/icons/50861diaoyong.gif) ![](/icons/50861dou.gif) 直到服务器告诉我们已经拿到整个邮件 ![](/icons/50861de.gif) 信息了 ![](/icons/50861dou.gif) 此时 ![](/icons/50861dou.gif) onStopRequest就会被 ![](/icons/50861diaoyong.gif) ![](/icons/50861dou.gif) 从而让我们开始处理邮件信息 ![](/icons/50861dou2.gif) 好了 ![](/icons/50861dou.gif) 这样我们就可以取得邮件 ![](/icons/50861de.gif) 完整信息了 ![](/icons/50861dou.gif) 接下来要做 ![](/icons/50861de.gif) 就是对邮件 ![](/icons/50861de.gif) 解析了 ![](/icons/50861dou.gif) 这个我还在研究 ![](/icons/50861dou.gif) 以后有机会再和大家分享心得体会 ![](/icons/50861dou2.gif) 附:还有另外 ![](/icons/50861yi.gif) 种思路可以获取邮件 ![](/icons/50861de.gif) 正文信息 ![](/icons/50861dou.gif) 有时间我再写篇文章介绍
相关文章
读者评论
发表评论
|
|