首页 »编程综合 » thunderbird:基于Mozilla Thunderbird的扩展开发( 4)---修改Thunderbird源代码实现自动保存附件 »正文
thunderbird:基于Mozilla Thunderbird的扩展开发( 4)---修改Thunderbird源代码实现自动保存附件
来源: 发布时间:星期四, 2009年1月15日 浏览:33次 评论:0
在上 ![](/icons/75944yi.gif) 篇 ![](/icons/75944smhl.gif) 基于Mozilla Thunderbird ![](/icons/75944de.gif) 扩展开发( 3)---如何获取邮件 ![](/icons/75944de.gif) 完整信息 ![](/icons/75944smhr.gif) 中给出了 ![](/icons/75944yi.gif) 种简单 ![](/icons/75944de.gif) 获取邮件 ![](/icons/75944de.gif) 完整信息(包括正文和附件等) ![](/icons/75944de.gif) 思路方法 ![](/icons/75944dou.gif) 但仔细考虑后发现离实际需求还有 ![](/icons/75944yi.gif) 段距离 ![](/icons/75944dou2.gif) Thunderbird中已经有保存附件 ![](/icons/75944de.gif) 功能 ![](/icons/75944dou.gif) 但需要手动去操作 ![](/icons/75944dou.gif) 既然手头有它 ![](/icons/75944de.gif) 源代码 ![](/icons/75944dou.gif) 为什么我们不自己尝试对它进行修改 ![](/icons/75944dou.gif) 从而使得它能自动保存所有附件呢?Ok,这篇文章就是基于这样思想 ![](/icons/75944de.gif) ![](/icons/75944yi.gif) 个尝试 首先明确 ![](/icons/75944yi.gif) 个前提 ![](/icons/75944dou.gif) 本文并不想开发 ![](/icons/75944yi.gif) 个扩展 ![](/icons/75944dou.gif) 而是尝试直接修改Thunderbird ![](/icons/75944de.gif) 源代码 ![](/icons/75944dou.gif) 但你也可以将它修改为 ![](/icons/75944yi.gif) 个扩展 ![](/icons/75944dou.gif) 这里为了调试开发简单起见 ![](/icons/75944dou.gif) 因此我选择了直接修改其代码 ![](/icons/75944dou2.gif) 要想自动保存附件 ![](/icons/75944dou.gif) 首先需要知道在它源代码中 ![](/icons/75944de.gif) 哪个点去执行保存附件这样 ![](/icons/75944yi.gif) 个动作 ![](/icons/75944dou.gif) 在多次试验后发现可以msgMail3PaneWindow.js中 ![](/icons/75944de.gif) 177行处 ![](/icons/75944de.gif) folderListener对象进行修改如下: var folderListener = { OnItemIntPropertyChanged: function(item, property, oldValue, Value) { (item gMsgFolderSelected) { (property.toString "TotalMessages" || property.toString "TotalUnreadMessages") { UpdateStatusMessageCounts(gMsgFolderSelected); UpdateFolderLocationPicker(item); //*************************************************************************** //Author: phinecos //Date : 2008/5/8 //Description:自动保存邮件到指定文件夹下 //Contact:[email protected] //*************************************************************************** (property.toString![](/icons/75944kh.gif) "TotalMessages" && Value>oldValue){//保存邮件到指定文件夹下 (messenger!=null && gDBView!=null){ try{ SaveAllMessages(saveFolderName); } catch(err){ } } } } } }, //*************************************************************************** //Author: phinecos //Date : 2008/5/8 //Description:保存所有邮件 //Contact:[email protected] //*************************************************************************** function SaveAllMessages(folerName) {//保存所有邮件,folerName是文件夹名称 (gDBView null) {//gDBView是空![](/icons/75944de.gif) ; } var treeView = gDBView.QueryInterface(Components. erfaces.nsITreeView); var count = treeView.rowCount; (!count) ; gDBView.doCommand(nsMsgViewCommandType.expandAll);//展开所有 邮件 var messageUri; var msgKey = null; for (var i = 0; i < count; i) {//保存第i个邮件 try { messageUri = gDBView.getURIForViewIndex(i);//邮件Uri msgKey = gDBView.getKeyAt(i);//邮件key try { gDBView.loadMessageByMsgKey(msgKey);//加载邮件 } catch(err) { alert("sory"); } var msgHdr = messenger.messageServiceFromURI(messageUri).messageURIToMsgHdr(messageUri); var result = true; result = msgHdr.folder.hasMsgOffline(msgHdr.messageKey); (result false) {//本地数据源中读取邮件 readOffline(msgHdr,messageUri,folerName); } ![](/icons/75944else.gif) {//从服务器上读邮件 //to be do future } } catch (ex) {// blow off errors for dummy rows continue; } } }
接下来那些具体保存邮件 ![](/icons/75944de.gif) 代码这里就省略了 ![](/icons/75944dou.gif) 具体可以参考上 ![](/icons/75944yi.gif) 篇文章 ![](/icons/75944dou.gif) 要重点提 ![](/icons/75944de.gif) ![](/icons/75944yi.gif) 点是这 ![](/icons/75944yi.gif) 句代码: gDBView.loadMessageByMsgKey(msgKey);//加载邮件 当执行它时 ![](/icons/75944dou.gif) 会加载邮件信息 ![](/icons/75944dou.gif) 从而会触发对附件 ![](/icons/75944de.gif) 处理 ![](/icons/75944hanshu.gif) ![](/icons/75944dou.gif) 因此我们可以在附件 ![](/icons/75944de.gif) 处理 ![](/icons/75944hanshu.gif) 中进行保存附件 ![](/icons/75944de.gif) 处理 ![](/icons/75944dou2.gif) msgHdrViewOverlay.js文件中第425行处 ![](/icons/75944de.gif) handleAttachment思路方法就是我们需要修改 ![](/icons/75944de.gif) 地方 ![](/icons/75944dou2.gif) handleAttachment: function(contentType, url, displayName, uri, isExternalAttachment) { ….(省略) //保存当前邮件 附件信息 var currentAttachment = createNewAttachmentInfo(contentType, url, displayName, uri, isExternalAttachment); ….(省略) // //*************************************************************************** //Author: phinecos //Date : 2008/5/17 //Description:保存附件 //Contact:[email protected] //*************************************************************************** var actionIndex = 0; // for (index in currentAttachment) { // exclude all attachments already deleted var attachment = currentAttachment;//当前待处理 附件 (attachment.contentType != 'text/x-moz-deleted') { var path = getDefaultSaveFolder ;//附件保存目录路径 var destFolder=makeFile ; destFolder.initWithPath(path); var folder=destFolder; var proposedfileobject = makeFile ; proposedfileobject.initWithFile(folder); proposedfileobject.appendRelativePath(attachment.displayName);//附件 目标文件 (proposedfileobject && proposedfileobject.parent && !proposedfileobject.parent.exists ) {//若父目录不存在 则先创建父目录 proposedfileobject.parent.create(proposedfileobject.DIRECTORY_TYPE, 0600); } aeMessenger.saveAttachmentToFolder(attachment.contentType, attachment.url,proposedfileobject.leafName, attachment.uri, proposedfileobject.parent, index);//保存当前待处理 附件 } // } },
真正完成保存附件 ![](/icons/75944de.gif) 是下面 ![](/icons/75944de.gif) aeMessenger对象: var aeMessenger = { Cc:Components. es, Ci:Components. erfaces, /**//* ************************************* saving ************************************* */ saveAttachmentToFolder:function(contentType,url,displayName,messageUri,aDestFolder,attachmentindex) { var out=aDestFolder.clone ; out=out.QueryInterface(Components. erfaces.nsILocalFile); out.append(displayName); (this.saveAttachment(out, url, messageUri, contentType, attachmentindex)) out;//保存附件 实际动作 null; }, //## // simplied version of this function, taking out all fetchservice stuff. saveAttachment:function(file, url, messageUri, contentType, attachmentindex) { try{ // strip out ?type=application/x-message-display because it confuses libmime (url.indexOf("?type=application/x-message-display")!=-1) { url=url.replace("?type=application/x-message-display","").replace('&','?'); } url=url.replace("/;section","?section"); var saveListener = aeSaveMsgListener(file, messenger,contentType,null,null,false); var convertedListener=saveListener.QueryInterface(Components. erfaces.nsIStreamListener);//流监听器 var messageService=messenger.messageServiceFromURI(messageUri);//邮件服务提供者 var openAttArgs= Array(contentType,file.leafName,url,messageUri,convertedListener,null,null);//apply思路方法所需要 参数 messageService.openAttachment.apply(null,openAttArgs); //真正去保存附件 } catch (e) { false; } true; }, }; 注:这里设置了 ![](/icons/75944yi.gif) 个流监听器 ![](/icons/75944de.gif) 作用是为了对文件流 ![](/icons/75944de.gif) 写入进行监控 ![](/icons/75944dou.gif) 并不是必须 ![](/icons/75944de.gif) 好了 ![](/icons/75944dou.gif) 这下就可以用make命令重新编译thunderbird源代码了 ![](/icons/75944dou.gif) 测试时先启动thunderbird ![](/icons/75944dou.gif) 当接收到新邮件并且其含有附件时 ![](/icons/75944dou.gif) 就会自动下载并保存
相关文章
读者评论
发表评论
|
|