如何在 Thunderbird 38.2+ 中创建日历/事件/约会邀请过滤器

如何在 Thunderbird 38.2+ 中创建日历/事件/约会邀请过滤器

我想标记所有包含日历邀请的来信。然后我想将它们移至其他文件夹。我尝试了答案,但它不起作用:我尝试找到一个名为“Content-Type”且内容为“text/calendar”的标题,但它不起作用。

我也尝试了插件菲塔奎拉,也失败了。我使用了以下代码:

var sHeaderToLookFor = "content-type";
var sContentInHeader = "text/calendar";
var bFoundIt = false;
function msgHdrGetHeaders(aMsgHdr, k) {
    let uri = aMsgHdr.folder.getUriForMsg(aMsgHdr);
    let messageService = MailServices.messenger.messageServiceFromURI(uri);
    MsgHdrToMimeMessage(aMsgHdr, null, function (aMsgHdr, aMimeMsg) { k(aMimeMsg);  }, true, { partsOnDemand: true, examineEncryptedParts:true });
}

msgHdrGetHeaders(message, function (aHeaders) {
    if (aHeaders.has(sHeaderToLookFor)) {
        var pattern = new RegExp(sContentInHeader);
        Application.console.log("InBetween_1");
        if (!bFoundIt)
            bFoundIt= pattern.test(aHeaders.get(sHeaderToLookFor));
        Application.console.log(bFoundIt);
        Application.console.log("InBetween_2");
    }
});

Application.console.log("AtEnd_1");
Application.console.log(bFoundIt);
Application.console.log("AtEnd_2");
bFoundIt;

在带有 .ics 邀请的电子邮件上测试过滤器后,我在控制台上看到以下输出:

AtEnd_1
false
AtEnd_2
InBetween_1
true
InBetween_2

因此,基本上,这个带有 JavaScript 的过滤器可以工作。但它不起作用,因为 MsgHdrToMimeMessage() 将在 Filter 返回“false”给 FiltaQuilla 后调用回调。我需要让代码等待(同步使用而不是异步使用),但我不知道该怎么做。

无论如何,我并没有真正专注于使用 FiltaQuilla。我只是想找到一个解决我的问题的方法。

我使用 IMAP 并将我的电子邮件保存在本地硬盘上以便离线阅读电子邮件。

有一个较旧的 Thunderbird 版本,FiltaQuilla 可以使用(例如 24.x),甚至还有更旧的 Thunderbird 版本(例如 3.x),标题过滤器可以使用。但是有些东西发生了变化,现在我不知道如何过滤了。

答案1

终于找到了解决方案。下面的 JavaScript 代码与 FiltaQuilla 和 Thunderbird 38.2.0 配合使用效果很好。

{
    var sHeaderToLookFor = "content-type";
    var sContentInHeader = "text/calendar";

    var hwindow = Components.classes["@mozilla.org/appshell/appShellService;1"]
            .getService(Components.interfaces.nsIAppShellService)
            .hiddenDOMWindow;
    function waitFor(callback, message, timeout, interval, thisObject) {
        timeout = timeout || 5000;
        interval = interval || 100;
        var self = {counter: 0, result: callback.call(thisObject)};
        function wait() {
            self.counter += interval;
            self.result = callback.call(thisObject);
        }
        var timeoutInterval = hwindow.setInterval(wait, interval);
        var thread = Components.classes["@mozilla.org/thread-manager;1"].getService().currentThread;
        while ((self.result != true) && (self.counter < timeout)) {
            thread.processNextEvent(true);
        }
        hwindow.clearInterval(timeoutInterval);
        if (self.counter >= timeout) {
            message = message || arguments.callee.name + ": Timeout exceeded for '" + callback + "'";
            throw new TimeoutError(message);
        }
      return true;
    }

    var bFoundIt = false;
    var called = false;
    function msgHdrGetHeaders(aMsgHdr, k) {
        let uri = aMsgHdr.folder.getUriForMsg(aMsgHdr);
        let messageService = MailServices.messenger.messageServiceFromURI(uri);
        MsgHdrToMimeMessage(aMsgHdr, null,
            function(aMsgHdr, aMimeMsg) {
                try {
                    k(aMimeMsg);
                }
                catch (ex)
                {
                }
                finally {
                    called = true;
                }
            },
            true, { partsOnDemand: true, examineEncryptedParts:true });
    }

    msgHdrGetHeaders(message, function (aHeaders) {
        if (aHeaders.has(sHeaderToLookFor)) {
            var pattern = new RegExp(sContentInHeader);
            // Application.console.log("InBetween_1");
            if (!bFoundIt)
                bFoundIt = pattern.test(aHeaders.get(sHeaderToLookFor));
            Application.console.log(bFoundIt);
            // Application.console.log("InBetween_2");
        }
    });

    waitFor(function () called, "Timeout waiting for message to be parsed");
    // Application.console.log("AtEnd_1");
    Application.console.log(bFoundIt);
    // Application.console.log("AtEnd_2");
    bFoundIt;
}

我使用了 waitFor() 函数https://searchcode.com/codesearch/view/21382111/。该链接似乎是来自 Thunderbird 测试库的源代码(/thunderbird-14.0/comm-release/mail/test/resources/mozmill/mozmill/extension/resource/modules/utils.js)

无论如何,如果其他人遇到类似的问题,他想要解析 IMAP 文件夹上的电子邮件标题,他可以使用上述代码,只需根据他的需要更改“sHeaderToLookFor”和“sContentInHeader”即可。

相关内容