5

Я хотел бы отметить все входящие письма, которые включают приглашение в календарь. Затем я хотел бы переместить их в другую папку. Я попробовал метод, описанный в этом ответе, но он не работает: я попытался найти заголовок с именем «Content-Type» с контентом «text /calendar», но он не работал.

Я также попробовал аддон 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 и сохраняю свои электронные письма на локальном жестком диске для чтения в автономном режиме.

Была более старая версия Thunderbird, в которой работал FiltaQuilla (что-то вроде 24.x), и там, где работали даже более старые версии Thunderbird (например, 3.x), где работали фильтры по заголовкам. Но что-то изменилось, и теперь я не знаю, как фильтровать.

1 ответ1

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" в соответствии со своими потребностями.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .