Як можна зробити фільтр для запрошень на календар / подію / зустрічі в програмі Thunderbird 38.2+


5

Я хотів би позначити всі вхідні листи, які включають запрошення до календаря. Тоді я хотів би перенести їх в іншу папку. Я спробував метод, описаний у цій відповіді, але він не працює: я спробував знайти заголовок під назвою "Content-Type" із вмістом "текст / календар", але це не спрацювало.

Я також спробував аддон FiltaQuilla , який теж не вдався. Я використовував наступний код там:

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 () буде викликати зворотний виклик після того, як фільтр повернеться "false" до FiltaQuilla. Мені потрібно змусити код чекати (використовувати його синхронно замість асинхронно), але я не маю уявлення про те, як це зробити.

У всякому разі, я не дуже зосереджений на використанні FiltaQuilla. Я просто хотів би вирішити свою проблему.

Я використовую IMAP і зберігаю електронні листи на своєму локальному HD для читання електронною поштою офлайн.

Була старша версія Thunderbird, де працював FiltaQuilla (щось на зразок 24.x), і там, де працювали навіть більш старі версії Thunderbird (як 3.x), де працювали фільтри на заголовках. Але щось змінилося, і тепер я вже не знаю, як фільтрувати.


Здається, це помилка Thunderbird: bugzilla.mozilla.org/show_bug.cgi?id=622307 . Але я не можу уявити, що це питання існує вже кілька років.
nusi

В якості проміжного рішення, яке я щойно придумав, ви можете шукати "ics" або "vcs" (це звичайні розширення файлів зустрічі в календарі). Зауважте, що використання цих розширень може залежати від клієнта та / або ОС, але воно може бути корисним як правило, так і для надзвичайних випадків.
ysmartin

Відповіді:


0

Нарешті знайшов рішення для цього. Нижче код 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" на свої потреби.


Нусі, чи можете ви пояснити, як налаштувати FiltaQuilla для використання сценарію? Дякую! Jay
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.