将TB从38.7.2更新为45.1.0后的TB插件错误

时间:2016-05-19 14:06:42

标签: thunderbird-addon

几年前,我制作了一个私有的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>

感谢您提供任何提示和支持!

1 个答案:

答案 0 :(得分:0)

经过更多的搜索,调试和思考(原文如此!)后我发现了问题: 在

var sfldr = fldrEnum.getNext();

界面丢失,看起来在TB45中有些东西已经改变,因此界面不会从某个地方自动检索(软件在没有这个界面的情况下工作了大约4或5年)。

所以正确的行是:

var sfldr = fldrEnum.getNext().QueryInterface(Components.interfaces.nsIMsgFolder);

我还检查了所有插件并添加了所有界面 - 现在它就像一个魅力。

单独在这里写问题帮助我找到了解决方案; - )