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

我还检查了所有插件并添加了所有接口 - 现在它运行起来非常棒。

单独将问题写在这里对我找到解决方案有很大帮助;-)