Wie kann ich in Thunderbird 38.2+ einen Filter für Kalender- / Ereignis- / Termineinladungen erstellen?

1313
nusi

Ich möchte alle eingehenden Mails mit einer Kalendereinladung versehen. Dann möchte ich sie in einen anderen Ordner verschieben. Ich habe die in dieser Antwort beschriebene Methode ausprobiert, aber sie funktioniert nicht: Ich habe versucht, einen Header namens "Content-Type" mit dem Inhalt "Text / Kalender" zu finden, aber es hat nicht funktioniert.

Ich habe auch das Addon FiltaQuilla ausprobiert, das ebenfalls fehlgeschlagen ist. Ich habe dort folgenden Code verwendet:

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; 

Ich hatte folgende Ausgabe auf der Konsole, nachdem ich den Filter in einer E-Mail mit einer .ics-Einladung getestet hatte:

AtEnd_1 false AtEnd_2 InBetween_1 true InBetween_2 

Grundsätzlich würde dieser Filter mit JavaScript funktionieren. Es funktioniert jedoch nicht, da MsgHdrToMimeMessage () den Rückruf aufruft, nachdem der Filter "false" an FiltaQuilla zurückgegeben hat. Ich müsste den Code warten lassen (verwenden Sie ihn synchron anstatt asynchron), aber ich habe keine Ahnung, wie das geht.

Wie auch immer, ich bin nicht wirklich auf FiltaQuilla konzentriert. Ich hätte gerne eine Lösung für mein Problem.

Ich verwende IMAP und speichere meine E-Mails auf meiner lokalen Festplatte, um sie offline lesen zu können.

Es gab eine ältere Thunderbird-Version, in der FiltaQuilla arbeitete (etwa 24.x), und dort, wo bereits ältere Versionen von Thunderbird (wie 3.x) mit Filtern auf Kopfzeilen funktionierten. Aber etwas hat sich geändert und jetzt weiß ich nicht mehr, wie ich filtern soll.

5
Es scheint, dass dies ein Fehler von Thunderbird ist: https://bugzilla.mozilla.org/show_bug.cgi?id=622307. Ich kann mir jedoch nicht vorstellen, dass dieses Problem schon seit mehreren Jahren besteht. nusi vor 8 Jahren 0
Als vorläufige Lösung, die ich mir gerade ausgedacht habe, können Sie nach "ics" oder "vcs" suchen (dies sind die üblichen Erweiterungen von Kalendertermindateien). Beachten Sie, dass die Verwendung dieser Erweiterungen vom Client und / oder Betriebssystem abhängen kann, sie kann jedoch als Faustregel oder für einen Notfall nützlich sein. ysmartin vor 5 Jahren 0

1 Antwort auf die Frage

0
nusi

Endlich eine Lösung dafür gefunden. Der folgende JavaScript-Code funktioniert gut mit FiltaQuilla und 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 = ; 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; } 

Ich habe die waitFor () - Funktion von https://searchcode.com/codesearch/view/21382111/ verwendet . Dieser Link scheint die Quelle aus der Thunderbird-Testbibliothek zu sein (/thunderbird-14.0/comm-release/mail/test/resources/mozmill/mozmill/extension/resource/modules/utils.js).

Wenn jemand anderes ein ähnliches Problem hat, bei dem er Header von E-Mails in IMAP-Ordnern analysieren will, kann er den obigen Code verwenden und "sHeaderToLookFor" und "sContentInHeader" an seine Bedürfnisse anpassen.

Nusi, können Sie erklären, wie Sie FiltaQuilla für die Verwendung Ihres Skripts konfigurieren können? Vielen Dank! Jay vor 8 Jahren 0