几年前,我制作了一个私有的Thunderbird插件,用于自动处理有关订阅的PayPal电子邮件。用户必须将paypal电子邮件放在某个文件夹" PaypalMsgs",然后插件逐个读取它们,找出它是付款,取消等等,然后更新"其他"地址簿中的人的领域。
该插件因Thunderbird最近更新至45.1.0而被破坏,因为它无法再找到PaypalMsgs文件夹。
这是查找文件夹的代码:
// determine the local root folder
var localRootFolder = Components
.classes["@mozilla.org/messenger/account-manager;1"]
.getService(Components.interfaces.nsIMsgAccountManager)
.localFoldersServer
.rootFolder;
// start with root folder to find folder with given name
this.ppPaypalFldr = this.findFldrDeep(localRootFolder, "PaypalMsgs");
// recursive function to find a folder fldr with the name fldrName
findFldrDeep: function(fldr, fldrName) {
if(fldr.name == fldrName) {
return fldr;
} else {
if(fldr.hasSubFolders) {
var fldrEnum = fldr.subFolders;
while(fldrEnum.hasMoreElements()) {
var sfldr = fldrEnum.getNext();
var result = this.findFldrDeep(sfldr, fldrName);
if(result) {
return result;
}
}
} else {
return null;
}
}
},
执行时没有任何反应,TB的错误控制台显示:
Error: TypeError: this.ppPaypalFldr undefined
在使用this.ppPaypalFldr的第一个位置
这可能是一件容易的事情,比如nsIMsgAccountManager服务的定义可能已经改变,或者文件夹类型突然有不同的功能,但我很难找到可靠的文档甚至是TB 45的源代码。< / p>
感谢您提供任何提示和支持!
答案 0 :(得分:0)
经过更多的搜索,调试和思考(原文如此!)后我发现了问题: 在
行var sfldr = fldrEnum.getNext();
界面丢失,看起来在TB45中有些东西已经改变,因此界面不会从某个地方自动检索(软件在没有这个界面的情况下工作了大约4或5年)。
所以正确的行是:
var sfldr = fldrEnum.getNext().QueryInterface(Components.interfaces.nsIMsgFolder);
我还检查了所有插件并添加了所有界面 - 现在它就像一个魅力。
单独在这里写问题帮助我找到了解决方案; - )