我想标记所有包含日历邀请的来信。然后我想将它们移至其他文件夹。我尝试了这答案,但它不起作用:我尝试找到一个名为“Content-Type”且内容为“text/calendar”的标题,但它不起作用。
我也尝试了插件菲塔奎拉,也失败了。我使用了以下代码:
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() 将在 Filter 返回“false”给 FiltaQuilla 后调用回调。我需要让代码等待(同步使用而不是异步使用),但我不知道该怎么做。
无论如何,我并没有真正专注于使用 FiltaQuilla。我只是想找到一个解决我的问题的方法。
我使用 IMAP 并将我的电子邮件保存在本地硬盘上以便离线阅读电子邮件。
有一个较旧的 Thunderbird 版本,FiltaQuilla 可以使用(例如 24.x),甚至还有更旧的 Thunderbird 版本(例如 3.x),标题过滤器可以使用。但是有些东西发生了变化,现在我不知道如何过滤了。
答案1
终于找到了解决方案。下面的 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”即可。