Como posso fazer um filtro para convites de calendário / evento / compromisso no Thunderbird 38.2+

3

Gostaria de marcar todos os e-mails recebidos que incluam um convite da agenda. Então eu gostaria de movê-los para uma pasta diferente. Eu tentei o método descrito em esta resposta, mas isso não acontece trabalhos: Eu tentei encontrar um cabeçalho chamado "Content-Type" com o conteúdo "text / calendar", mas não funcionou.

Eu também tentei o addon FiltaQuilla , que também falhou. Eu usei o seguinte código lá:

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;

Eu tinha a seguinte saída no console depois de testar o filtro em um e-mail com um convite do .ics:

AtEnd_1
false
AtEnd_2
InBetween_1
true
InBetween_2

Então, basicamente, esse filtro com JavaScript funcionaria. Mas isso não funciona porque MsgHdrToMimeMessage () irá chamar o retorno de chamada após o filtro ter retornado "false" para FiltaQuilla. Eu precisaria fazer o código esperar (usá-lo de forma síncrona em vez de assíncrona), mas não tenho idéia de como fazer isso.

De qualquer forma, não estou realmente focado em usar o FiltaQuilla. Eu gostaria apenas de ter uma solução para o meu problema.

Eu uso o IMAP e salvo meus e-mails no HD local para leitura de e-mails off-line.

Havia uma versão antiga do Thunderbird onde o FiltaQuilla funcionava (algo como 24.x), e onde havia versões mais antigas do Thunderbird (como 3.x) onde os filtros nos cabeçalhos funcionavam. Mas algo mudou e agora eu não sei mais como filtrar.

    
por nusi 27.08.2015 / 19:21

1 resposta

0

Finalmente encontrei uma solução para isso. O código JavaScript abaixo funciona bem com o FiltaQuilla e o 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;
}

Eu usei a função waitFor () do link . Esse link parece ser a fonte da biblioteca de testes do Thunderbird (/thunderbird-14.0/comm-release/mail/test/resources/mozmill/mozmill/extension/resource/modules/utils.js)

De qualquer forma, se alguém tiver um problema semelhante, onde ele quiser analisar cabeçalhos de emails em pastas IMAP, ele poderá usar o código acima e apenas alterar "sHeaderToLookFor" e "sContentInHeader" para suas necessidades.

    
por 31.08.2015 / 12:45