您的位置:首页 > 编程语言

基于Mozilla Thunderbird的扩展开发(四)---修改Thunderbird源代码实现自动保存附件

2008-05-18 20:50 591 查看


Mozilla扩展系列链接:
1浅谈基于Mozilla Thunderbird的扩展开发
2基于Mozilla平台的扩展开发(续)----XPCOM组件篇
3基于MozillaThunderbird的扩展开发(三)---如何获取邮件的完整信息
4基于MozillaThunderbird的扩展开发(四)---修改Thunderbird源代码实现自动保存附件
在上一篇《基于Mozilla Thunderbird的扩展开发(三)---如何获取邮件的完整信息》中给出了一种简单的获取邮件的完整信息(包括正文和附件等)的方法,但仔细考虑后发现离实际需求还有一段距离。
Thunderbird中已经有保存附件的功能,但需要手动去操作,既然手头有它的源代码,为什么我们不自己尝试对它进行修改,从而使得它能自动保存所有附件呢?Ok,这篇文章就是基于这样思想的一个尝试。
首先明确一个前提,本文并不想开发一个扩展,而是尝试直接修改Thunderbird的源代码,但你也可以将它修改为一个扩展,这里为了调试开发简单起见,因此我选择了直接修改其代码。
要想自动保存附件,首先需要知道在它源代码中的哪个点去执行保存附件这样一个动作,在多次试验后发现可以msgMail3PaneWindow.js中的177行处的folderListener对象进行修改如下:







var folderListener =

{






OnItemIntPropertyChanged: function(item, property, oldValue, newValue)

{




if (item == gMsgFolderSelected)

{




if(property.toString() == "TotalMessages" || property.toString() == "TotalUnreadMessages")

{








UpdateStatusMessageCounts(gMsgFolderSelected);





UpdateFolderLocationPicker(item);


//***************************************************************************


//Author: phinecos


//Date : 2008/5/8


//Description:自动保存邮件到指定文件夹下


//Contact:phinecos@163.com


//***************************************************************************




if(property.toString()=="TotalMessages" && newValue>oldValue)

{//保存邮件到指定文件夹下




if(messenger!=null && gDBView!=null)

{




try

{


SaveAllMessages(saveFolderName);


}




catch(err)

{


}


}


}


}


}


},


//***************************************************************************


//Author: phinecos


//Date : 2008/5/8


//Description:保存所有邮件


//Contact:phinecos@163.com


//***************************************************************************


function SaveAllMessages(folerName)






{//保存所有邮件,folerName是文件夹名称


if(gDBView==null)






{//gDBView是空的


return;


}


var treeView = gDBView.QueryInterface(Components.interfaces.nsITreeView);


var count = treeView.rowCount;


if (!count)


return;


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);


if(result==false)






{//本地数据源中读取邮件


readOffline(msgHdr,messageUri,folerName);


}


else






{//从服务器上读邮件


//to be do future


}


}


catch (ex)






{// blow off errors for dummy rows


continue;


}


}


}



接下来那些具体保存邮件的代码这里就省略了,具体可以参考上一篇文章,要重点提的一点是这一句代码:


gDBView.loadMessageByMsgKey(msgKey);//加载邮件



当执行它时,会加载邮件信息,从而会触发对附件的处理函数,因此我们可以在附件的处理函数中进行保存附件的处理。
msgHdrViewOverlay.js文件中第425行处的handleAttachment方法就是我们需要修改的地方。


handleAttachment: function(contentType, url, displayName, uri, isExternalAttachment)






{


….(省略)


//保存当前邮件的附件信息


var currentAttachment = new createNewAttachmentInfo(contentType, url, displayName, uri, isExternalAttachment);


….(省略)


//


//***************************************************************************


//Author: phinecos


//Date : 2008/5/17


//Description:保存附件


//Contact:phinecos@163.com


//***************************************************************************


var actionIndex = 0;


// for (index in currentAttachment) {


// exclude all attachments already deleted


var attachment = currentAttachment;//当前待处理的附件




if (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);//附件的目标文件




if (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);//保存当前待处理的附件


}


// }


},



真正完成保存附件的是下面的aeMessenger对象:


var aeMessenger =






{


Cc:Components.classes,


Ci:Components.interfaces,






/**//* ************************************* saving ************************************* */


saveAttachmentToFolder:function(contentType,url,displayName,messageUri,aDestFolder,attachmentindex)






{


var out=aDestFolder.clone();


out=out.QueryInterface(Components.interfaces.nsILocalFile);


out.append(displayName);


if (this.saveAttachment(out, url, messageUri, contentType, attachmentindex)) return out;//保存附件的实际动作


else return 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




if (url.indexOf("?type=application/x-message-display")!=-1)

{


url=url.replace("?type=application/x-message-display","").replace('&','?');


}


url=url.replace("/;section","?section");





var saveListener = new aeSaveMsgListener(file, messenger,contentType,null,null,false);





var convertedListener=saveListener.QueryInterface(Components.interfaces.nsIStreamListener);//流监听器




var messageService=messenger.messageServiceFromURI(messageUri);//邮件服务提供者


var openAttArgs=new Array(contentType,file.leafName,url,messageUri,convertedListener,null,null);//apply方法所需要的参数


messageService.openAttachment.apply(null,openAttArgs); //真正去保存附件


}


catch (e)






{


return false;


}


return true;


},


};



注:这里设置了一个流监听器的作用是为了对文件流的写入进行监控,并不是必须的
好了,这下就可以用make命令重新编译thunderbird源代码了,测试时先启动thunderbird,当接收到新邮件并且其含有附件时,就会自动下载并保存。
如果需要完整的源代码,请发email至:phinecos#163.com(#改为@)

Reference:
1, http://www.eviljeff.com/?page=moz-extensions
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐