Как сделать фильтр для приглашений на календарь / событие / встречу в Thunderbird 38.2+

1263
nusi

Я хотел бы отметить все входящие письма, которые включают приглашение в календарь. Затем я хотел бы переместить их в другую папку. Я попробовал метод, описанный в этом ответе, но он не работает: я попытался найти заголовок с именем «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), где работали фильтры по заголовкам. Но что-то изменилось, и теперь я не знаю, как фильтровать.

5
Похоже, что это ошибка Thunderbird: https://bugzilla.mozilla.org/show_bug.cgi?id=622307. Но я не могу представить, что эта проблема существует в течение нескольких лет. nusi 8 лет назад 0
В качестве временного решения, которое я только что придумал, вы можете найти «ics» или «vcs» (это обычные расширения файлов календарных встреч). Обратите внимание, что использование этих расширений может зависеть от клиента и / или ОС, но может быть полезно как практическое правило или в экстренных случаях. ysmartin 5 лет назад 0

1 ответ на вопрос

0
nusi

Finally found a solution for that. Below JavaScript code works fine with FiltaQuilla and 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; } 

I used the waitFor() function from https://searchcode.com/codesearch/view/21382111/. That link seems to be the source from the Thunderbird test library (/thunderbird-14.0/comm-release/mail/test/resources/mozmill/mozmill/extension/resource/modules/utils.js)

Anyway, if someone else has a similar problem, where he wants to parse headers of emails on IMAP folders, he can use above code and just change "sHeaderToLookFor" and "sContentInHeader" to his needs.

Nusi, можете ли вы объяснить, как настроить FiltaQuilla для использования вашего скрипта? Спасибо! сойка 8 лет назад 0