nus*_*usi 5 email thunderbird calendar thunderbird-addon email-filter
我想标记所有包含日历邀请的传入邮件。然后我想将它们移动到不同的文件夹中。我尝试了这个答案中描述的方法,但它不起作用:我尝试了一个名为“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;
Run Code Online (Sandbox Code Playgroud)
在带有 .ics 邀请的电子邮件上测试过滤器后,我在控制台上有以下输出:
AtEnd_1
false
AtEnd_2
InBetween_1
true
InBetween_2
Run Code Online (Sandbox Code Playgroud)
所以基本上,这个带有 JavaScript 的过滤器会起作用。但它不起作用,因为 MsgHdrToMimeMessage() 将在过滤器向 FiltaQuilla 返回“false”后调用回调。我需要让代码等待(同步而不是异步使用它),但我不知道如何做到这一点。
无论如何,我并不是真正专注于使用 FiltaQuilla。我只想为我的问题找到解决方案。
我使用 IMAP 并将我的电子邮件保存在本地 HD 上,以便离线阅读电子邮件。
FiltaQuilla 有一个较旧的 Thunderbird 版本(类似于 24.x),在那里甚至是 Thunderbird 的较旧版本(例如 3.x)在标题上的过滤器工作。但是有些事情发生了变化,现在我不知道如何过滤了。
终于找到了解决方案。下面的 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;
}
Run Code Online (Sandbox Code Playgroud)
我使用了https://searchcode.com/codesearch/view/21382111/中的 waitFor() 函数。该链接似乎是 Thunderbird 测试库的来源(/thunderbird-14.0/comm-release/mail/test/resources/mozmill/mozmill/extension/resource/modules/utils.js)
无论如何,如果其他人有类似的问题,他想解析 IMAP 文件夹上的电子邮件标题,他可以使用上面的代码,只需将“sHeaderToLookFor”和“sContentInHeader”更改为他的需要。
| 归档时间: |
|
| 查看次数: |
2159 次 |
| 最近记录: |