将 TB 从 38.7.2 更新到 45.1.0 后出现 TB 插件错误
TB Plugin errors after updating TB from 38.7.2 to 45.1.0
几年前,我制作了一个私人 Thunderbird 插件,用于自动处理有关订阅的 paypal 电子邮件。用户必须将贝宝电子邮件放在某个文件夹 "PaypalMsgs" 中,插件会一个一个地读取它们,找出是否是付款、取消等,然后更新 "Other" 字段通讯录中的人。
最近将 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 的源代码.
感谢您的任何提示和支持!
经过更多的搜索、调试和思考(原文如此!)我发现了问题:
在行
var sfldr = fldrEnum.getNext();
接口丢失,看起来在 TB45 中有些东西发生了变化,所以接口不会自动从某个地方检索(软件在没有这个接口的情况下工作了大约 4 或 5 年)。
所以正确的行是:
var sfldr = fldrEnum.getNext().QueryInterface(Components.interfaces.nsIMsgFolder);
我还检查了所有插件并添加了所有接口 - 现在它运行起来非常棒。
单独将问题写在这里对我找到解决方案有很大帮助;-)
几年前,我制作了一个私人 Thunderbird 插件,用于自动处理有关订阅的 paypal 电子邮件。用户必须将贝宝电子邮件放在某个文件夹 "PaypalMsgs" 中,插件会一个一个地读取它们,找出是否是付款、取消等,然后更新 "Other" 字段通讯录中的人。
最近将 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 的源代码.
感谢您的任何提示和支持!
经过更多的搜索、调试和思考(原文如此!)我发现了问题: 在行
var sfldr = fldrEnum.getNext();
接口丢失,看起来在 TB45 中有些东西发生了变化,所以接口不会自动从某个地方检索(软件在没有这个接口的情况下工作了大约 4 或 5 年)。
所以正确的行是:
var sfldr = fldrEnum.getNext().QueryInterface(Components.interfaces.nsIMsgFolder);
我还检查了所有插件并添加了所有接口 - 现在它运行起来非常棒。
单独将问题写在这里对我找到解决方案有很大帮助;-)