专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » thunderbird:基于Mozilla ThunderBird的扩展开发( 3)---如何获取邮件的完整信息 »正文

thunderbird:基于Mozilla ThunderBird的扩展开发( 3)---如何获取邮件的完整信息

来源: 发布时间:星期四, 2009年1月15日 浏览:35次 评论:0
  如果你没有读过ThunderBird源代码也许会和我样想当然地认为里面肯定有某个数据结构用于存储邮件正文和附件等信息但如果你读过了代码那么也会和我样感到遗憾居然没有这样完整数据结构!里面有个表示邮件头XPCOM 组件 nsIMsgHdr 但mozilla这帮人却没有定义个用来表示邮件(包括邮件头正文附件等信息)组件” nsIMsg”呢问题更进你会发现它里面采用了个gDBView个msgWindow,这两个对象具体含义这里就不多说了反正是让我们想获取到邮件完整信息这件事更加困难了

  好那我现在就要结合自己实际开发讲解下如何去获取指定邮件完整信息了let’s go!

  首先要明确是你要获取邮件是离线(存储在本地)还是在线(在服务器上)要实现这个判断我们可以用如下代码:

(mail.folder.hasMsgOffline(mail.messageKey)) {
    readOffline(mail);//从本地读
  } {
    readOnline(mail);//从服务器读
  }


  如果邮件在本地我们可以直接让它所在文件夹给我们个代表整个邮件输入流对象要完成这个工作你得创建个nsIInputStream作用是用来“包含”邮件信息nsIMsgFoldergetOfflineFileStream思路方法可以返回这样个流对象这个思路方法有个输入参数(表示邮件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);
  }


  如果你要在线读取邮件那就有点复杂了你得让IMAP服务器端告诉你邮件信息而这是个异步事件也就是你发出指令然后等待来自服务器反馈信息因此你得监听来自服务器端反馈信息

  首先我们获取邮件URI,这可以通过其所在文件夹获得然后我们查找邮件服务提供者---IMAP,POP等让它来处理邮件信息:

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,现在我们已经有个处理邮件URI邮件服务提供者了接下来就可以通过它个思路方法CopyMessage来从服务器端获取邮件了并且可以将邮件放入个输入流中从而使得我们可以传入个nsIStreamListener来监听这个输入流是否有数据到来

var aurl = Object;
    messageService.CopyMessage(uri,
      myStreamListener, false, null, msgWindow, aurl);
  }


  输入流监听器会负责处理来自服务器端数据:

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直被直到服务器告诉我们已经拿到整个邮件信息了此时onStopRequest就会被从而让我们开始处理邮件信息

  好了这样我们就可以取得邮件完整信息了接下来要做就是对邮件解析了这个我还在研究以后有机会再和大家分享心得体会

  附:还有另外种思路可以获取邮件正文信息有时间我再写篇文章介绍



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: