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

简介:
 
 20080506.bmp
Mozilla扩展系列链接:
1,浅谈基于MozillaThunderBird的扩展开发
2,基于Mozilla平台的扩展开发(续)----XPCOM组件篇
3,基于Mozilla ThunderBird的扩展开发(三)---如何获取邮件的完整信息
 

    如果你没有读过ThunderBird的源代码,也许会和我一样想当然地认为里面肯定有某个数据结构用于存储邮件的正文和附件等信息,但如果你读过了代码,那么也会和我一样感到遗憾,居然没有这样完整的数据结构!里面有一个表示邮件头的XPCOM 组件 nsIMsgHdr , 但mozilla这帮人却没有定义一个用来表示邮件(包括邮件头,正文,附件等信息)的组件” nsIMsg”呢,问题更进一步,你会发现它里面采用了一个gDBView,一个msgWindow,这两个对象的具体含义这里就不多说了,反正是让我们想获取到邮件的完整信息这件事更加困难了。
      好的,那我现在就要结合自己的实际开发讲解下如何去获取指定邮件的完整信息了,let’s go!

      首先要明确的是你要获取的邮件是离线的(存储在本地)还是在线的(在服务器上),要实现这个判断,我们可以用如下代码:
if (mail.folder.hasMsgOffline(mail.messageKey)) {
       readOffline(mail);//从本地读
   } else {
       readOnline(mail);//从服务器读
   } 

      如果邮件在本地,我们可以直接让它所在的文件夹给我们一个代表整个邮件的输入流对象,要完成这个工作,你得创建一个nsIInputStream,它的作用是用来“包含”邮件信息,nsIMsgFolder的getOfflineFileStream方法可以返回这样一个流对象,这个方法有一个输入参数(表示邮件key),两个输出参数.
function readOffline(mail) {
        var key = mail.messageKey;
        var offset = new Object();
        var messageSize = new Object();
        var is;
          var bodyAndHdr;

        try{ is = mail.folder.getOfflineFileStream(key,offset,messageSize); }
        catch(e){ alert("message: "+e.message); }
        try{
            var sis = factory.createInstance(
                Components.interfaces.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.classes['@mozilla.org/messenger;1']
                        .createInstance();
        messenger = messenger.QueryInterface(
                        Components.interfaces.nsIMessenger
                    );
        var messageService = messenger.messageServiceFromURI(uri);//邮件服务提供者

   ok,现在我们已经有一个处理邮件URI的邮件服务提供者了,接下来就可以通过它一个方法CopyMessage来从服务器端获取邮件了,并且可以将邮件放入一个输入流中,从而使得我们可以传入一个nsIStreamListener来监听这个输入流是否有数据到来。
var aurl = new Object();
        messageService.CopyMessage(uri,
            myStreamListener, false, null, msgWindow, aurl);
    }

   输入流监听器会负责处理来自服务器端的数据的:
var myStreamListener = {
         onDataAvailable: 
            function(request, context, inputStream, offset, count){
                try {
                    var sis= Components.
                             classes["@mozilla.org/scriptableinputstream;1"]
                             .createInstance(
                                Components.interfaces.nsIScriptableInputStream
                             );
                    sis.init(inputStream);
                    bodyAndHdr += sis.read(count);
                }
                catch(ex) { alert("exception caught: "+ex.message+"\n"); }
         },
         onStartRequest: function(request, context) { },
         onStopRequest: function(aRequest, aContext, aStatusCode) {
             doSomethingWith(bodyAndHdr);
         }
    };

onDataAvailable函数会一直被调用,直到服务器告诉我们已经拿到整个邮件的信息了,此时,onStopRequest就会被调用,从而让我们开始处理邮件信息。
     
   好了,这样我们就可以取得邮件的完整信息了,接下来要做的就是对邮件的解析了,这个我还在研究,以后有机会再和大家分享心得。
附:还有另外一种思路可以获取邮件的正文信息,有时间我再写篇文章介绍。
 
 Reference:
1,http://simon-cozens.org:81/programmer/articles/thunderbird-js.pod
2,http://thunderbirddocs.blogspot.com/



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/05/05/1184110.html,如需转载请自行联系原作者

目录
相关文章
|
29天前
|
Web App开发 API Windows
取接口访问者信息[IP,浏览器,操作系统]免费API接口教程
此API用于获取访问者的IP地址、浏览器和操作系统信息,支持70多种浏览器和操作系统。通过POST或GET请求至`https://cn.apihz.cn/api/ip/getapi.php`,需提供用户ID和KEY。返回结果包括状态码、消息、IP、浏览器和操作系统信息。示例:{"code":200,"ip":"175.154.88.178","browser":"Chrome","os":"Windows 10"}。详情见官网文档。
|
2月前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
|
4月前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
73 0
|
6月前
|
自然语言处理 安全 API
触发邮件接口有哪些?邮件API文档
**触发邮件接口**如AokSend、Mailgun、Amazon SES、Postmark和Sendinblue是自动化企业通信的关键。这些接口在特定事件时自动发送邮件,提高效率和客户体验。例如,AokSend提供详细的API文档,支持事件触发、模板管理和多语言集成;Mailgun以灵活性著称;Amazon SES适合大规模发送;Postmark专注于事务邮件;Sendinblue则提供邮件、短信和营销自动化功能。每种服务都有示例代码展示如何使用API发送邮件。选择合适的接口能提升企业通信效率和客户满意度。
|
6月前
|
XML JSON 数据安全/隐私保护
如何使用Fiddler抓取APP接口和微信授权网页源代码
Fiddler是一款强大的抓包工具,用于捕获HTTP/HTTPS流量,包括手机APP和微信授权页面的数据。下载安装Fiddler后,需设置电脑代理,如端口8888,并在手机上配置相同代理,确保两者在同一局域网。通过安装Fiddler证书,可解密HTTPS请求。在手机上打开目标应用或网页,Fiddler将显示请求详情,便于接口调试和数据查看。
269 0
如何使用Fiddler抓取APP接口和微信授权网页源代码
|
7月前
|
存储 移动开发 前端开发
如何写html邮件 —— 参考主流outook、gmail、qq邮箱渲染邮件过程
如何写html邮件 —— 参考主流outook、gmail、qq邮箱渲染邮件过程
554 1
|
网络安全 数据安全/隐私保护
MAC使用Charles,代理后,部分网页无法打开解决方法
关闭charles,重新打开,可正常访问日常网站。访问时,提示:您的连接不是私密连接,多半是因为,MAC系统未安装charles证书导致,解决方法如下: 1. 打开Charles,选择Help->SSL Proxy→Install Charles Root Certificate 2. 在弹出的添加证书窗口中,选择添加,可以看到在钥匙串访问窗口中,该证书已成功添加,但是此时该证书仍然不被信任 3.双击此证书,在弹出的Charles Proxy CA窗口中,点击信任按钮,使用此证书时,选择始终信任后关闭窗口,使用账号和密码授权后,即可看到此证书已经被信任了。。。
5555 0
MAC使用Charles,代理后,部分网页无法打开解决方法