<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><lock v:ext="edit" aspectratio="t"></lock></shapetype>
|
Mozilla扩展系列链接:
1,浅谈基于Mozilla Thunderbird的扩展开发
2,基于Mozilla平台的扩展开发(续)----XPCOM组件篇
3,基于MozillaThunderbird的扩展开发(三)---如何获取邮件的完整信息
4,基于MozillaThunderbird的扩展开发(四)---修改Thunderbird源代码实现自动保存附件
|
在上一篇《基于Mozilla Thunderbird的扩展开发(三)---如何获取邮件的完整信息》中给出了一种简单的获取邮件的完整信息(包括正文和附件等)的方法,但仔细考虑后发现离实际需求还有一段距离。
Thunderbird中已经有保存附件的功能,但需要手动去操作,既然手头有它的源代码,为什么我们不自己尝试对它进行修改,从而使得它能自动保存所有附件呢?Ok,这篇文章就是基于这样思想的一个尝试。
首先明确一个前提,本文并不想开发一个扩展,而是尝试直接修改Thunderbird的源代码,但你也可以将它修改为一个扩展,这里为了调试开发简单起见,因此我选择了直接修改其代码。
要想自动保存附件,首先需要知道在它源代码中的哪个点去执行保存附件这样一个动作,在多次试验后发现可以msgMail3PaneWindow.js中的177行处的folderListener对象进行修改如下:
varfolderListener={
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
//***************************************************************************
functionSaveAllMessages(folerName)
{//保存所有邮件,folerName是文件夹名称
if(gDBView==null)
{//gDBView是空的
return;
}
vartreeView=gDBView.QueryInterface(Components.interfaces.nsITreeView);
varcount=treeView.rowCount;
if(!count)
return;
gDBView.doCommand(nsMsgViewCommandType.expandAll);//展开所有的邮件
varmessageUri;
varmsgKey=null;
for(vari=0;i<count;++i)
{//保存第i个邮件
try
{
messageUri=gDBView.getURIForViewIndex(i);//邮件Uri
msgKey=gDBView.getKeyAt(i);//邮件key
try
{
gDBView.loadMessageByMsgKey(msgKey);//加载邮件
}
catch(err)
{
alert("sory");
}
varmsgHdr=messenger.messageServiceFromURI(messageUri).messageURIToMsgHdr(messageUri);
varresult=true;
result=msgHdr.folder.hasMsgOffline(msgHdr.messageKey);
if(result==false)
{//本地数据源中读取邮件
readOffline(msgHdr,messageUri,folerName);
}
else
{//从服务器上读邮件
//tobedofuture
}
}
catch(ex)
{//blowofferrorsfordummyrows
continue;
}
}
}
接下来那些具体保存邮件的代码这里就省略了,具体可以参考上一篇文章,要重点提的一点是这一句代码:
gDBView.loadMessageByMsgKey(msgKey);//加载邮件
当执行它时,会加载邮件信息,从而会触发对附件的处理函数,因此我们可以在附件的处理函数中进行保存附件的处理。
msgHdrViewOverlay.js文件中第425行处的handleAttachment方法就是我们需要修改的地方。
handleAttachment:function(contentType,url,displayName,uri,isExternalAttachment)
{
….(省略)
//保存当前邮件的附件信息
varcurrentAttachment=newcreateNewAttachmentInfo(contentType,url,displayName,uri,isExternalAttachment);
….(省略)
//
//***************************************************************************
//Author:phinecos
//Date:2008/5/17
//Description:保存附件
//Contact:phinecos@163.com
//***************************************************************************
varactionIndex=0;
//for(indexincurrentAttachment){
//excludeallattachmentsalreadydeleted
varattachment=currentAttachment;//当前待处理的附件
if(attachment.contentType!='text/x-moz-deleted'){
varpath=getDefaultSaveFolder();//附件保存目录路径
vardestFolder=makeFile();
destFolder.initWithPath(path);
varfolder=destFolder;
varproposedfileobject=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对象:
varaeMessenger=
{
Cc:Components.classes,
Ci:Components.interfaces,
/**//**************************************saving**************************************/
saveAttachmentToFolder:function(contentType,url,displayName,messageUri,aDestFolder,attachmentindex)
{
varout=aDestFolder.clone();
out=out.QueryInterface(Components.interfaces.nsILocalFile);
out.append(displayName);
if(this.saveAttachment(out,url,messageUri,contentType,attachmentindex))returnout;//保存附件的实际动作
elsereturnnull;
},//##
//simpliedversionofthisfunction,takingoutallfetchservicestuff.
saveAttachment:function(file,url,messageUri,contentType,attachmentindex)
{
try{
//stripout?type=application/x-message-displaybecauseitconfuseslibmime
if(url.indexOf("?type=application/x-message-display")!=-1){
url=url.replace("?type=application/x-message-display","").replace('&','?');
}
url=url.replace("/;section","?section");
varsaveListener=newaeSaveMsgListener(file,messenger,contentType,null,null,false);
varconvertedListener=saveListener.QueryInterface(Components.interfaces.nsIStreamListener);//流监听器
varmessageService=messenger.messageServiceFromURI(messageUri);//邮件服务提供者
varopenAttArgs=newArray(contentType,file.leafName,url,messageUri,convertedListener,null,null);//apply方法所需要的参数
messageService.openAttachment.apply(null,openAttArgs);//真正去保存附件
}
catch(e)
{
returnfalse;
}
returntrue;
},
};
注:这里设置了一个流监听器的作用是为了对文件流的写入进行监控,并不是必须的
好了,这下就可以用make命令重新编译thunderbird源代码了,测试时先启动thunderbird,当接收到新邮件并且其含有附件时,就会自动下载并保存。
如果需要完整的源代码,请发email至:phinecos#163.com(#改为@)
Reference:
1,http://www.eviljeff.com/?page=moz-extensions
分享到:
相关推荐
Mozilla Thunderbird中文名“雷鸟”是从Mozilla Application Suite独立出来的电子邮件客户端软件。软件继承了Mozilla邮件组件的功能并行重新设计,可整合多个网络邮箱于一体,随时都能拉取邮件到本地处理,或者随时...
Thunderbird Setup 13.0.1.exe
Mozext Mozilla Firefox和Mozilla Thunderbird的扩展/附加组件请检查我的专用网站以获取更多详细信息: → 目录WebExtensions / MailExtensions | 请检查每个文件夹中的特定自述文件以获取构建说明。雷鸟 火狐浏览器...
雷鸟Mozilla Thunderbird自动化设置理想情况下,它将其定位为Web服务器上的独立程序。 Thunder,根据其目录中的文件,访问Web服务器并接收配置。 并且根据后者的“指针”,它为用户设置了一个配置文件。 您不想将...
基于 Mozilla firefox 的扩展开发教程。如果你对firefox插件感兴趣,或许你也可以成为开发中的一员。
Mozilla Thunderbird是由Mozilla浏览器的邮件功能部件所改造的邮件工具,使用 XUL 程序界面语言所设计,是专门为搭配 Mozilla Firefox 浏览器使用者所设计的邮件客户端软件,介面设计更简洁、而且免安装。
本分详细对Mozilla的结构和对其进行扩展的基本步骤。
XML语言语法 Javascript等在Mozilla的应用
这个扩展是在线可用的Mozilla Thunderbird电子邮件客户端 Thunderbird online是一款Chrome扩展程序,提供功能齐全的电子邮件客户端,RSS和新闻组客户端。它支持不同的邮件帐户(POP,IMAP,Gmail)。它具有电子邮件...
mozilla_thunderbird_102
Stormhen(基于Mozilla Thunderbird)使用的便携式应用程序 :rocket: 。 可以在上找到文档和下载内容。 :warning_selector: 根据Mozilla的商标侵权报告( ),Thunderbird Portable在Portapps上被命名为Stormhen ...
Thunderbird-Tray是流行的电子邮件客户端Mozilla Thunderbird的系统托盘启动器工具。 您可以在不需要时使用TB托盘将Thunderbird隐藏在托盘中。 单击任务栏图标时,TB-Tray将还原Thunderbird。
Thunderbird Chrome文件夹-自定义Thunderbird V68 +的颜色,图标,间距和字体 安装将整个chrome文件夹放入您的个人资料中。 如果已经存在,请首先重命名。 文件userChrome.css是一个外壳,仅导入其他CSS文件即可...
Nostalgy是Mozilla Thunderbird的扩展,其目的是通过使用键盘进行更多的操作来节省时间。 如果您想使用Thunderbird而不牺牲旧式杂色羊皮/松木的生产力,那么此扩展适合您! Alain Frisch的原始代码。 由光电...
介绍了Mozilla扩展开发的基本知识和开发过程。
继续跑 Mozilla Thunderbird的附加组件
DKIM验证程序 这是Mozilla Thunderbird的附加组件,可根据RFC 6376验证DKIM签名。 Wiki中的更多信息,为 包含的第三方库 Joshua Tauberer的DNS库(Thunderbird发件人验证扩展的一部分)( ) dns.js-DNS库
雷鸟主题弧 灵感来自雷鸟的弧形主题。 安装 Mozilla附加组件(推荐) 手动的 ...unzip thunderbird-theme-arc.xpi && rm thunderbird-theme-arc.xpi zip -r thunderbird-theme-arc.xpi manifest.json
mozilla-win32-1.3-installer.exe用于cygwin搭建环境。
Mozilla 3e 日历提供程序 (发音为“threee”)是一套客户端和服务器应用程序,它们共同提供...开发环境这个扩展依赖于 Mozilla Build System 和 Mozilla Thunderbird 以及 Mozilla Calendar 头文件。 不幸的是,Mozill