是否可以为 Thunderbird 编写自己的过滤器,我不在乎使用什么语言。
我希望能够对电子邮件(标题和文本)进行全面分析,并根据内容采取某些措施。
如果我能够将当前电子邮件与之前收到的消息进行比较,则可以获得加分(主要是为了删除重复的日志消息)
答案1
实际上,使用 FiltaQuilla 是可行的。(尝试过 FiltaQuilla 1.1.0 和 Thunderbird 3.1.9)。
下面是 FiltaQuilla 提供的“javascript action with body”下的测试脚本。它确实在错误控制台中显示了所有标头属性和正文。
一旦这些数据字段可供代码使用,它就需要遍历 messenger 文件夹和消息来比较它们。也许使用 hdr 上的“threadParent”属性可以简化逻辑,请参阅 MDC 上的 nsIMsgDBHdr 以获得提示。在代码中,可以设置额外的属性。例如,在代码中为重复的消息设置“hdr.myvar='1234'”,然后在稍后的过滤器中将 myvar 匹配为 1234 并执行正常操作以删除它们。
由于此脚本是过滤器的操作部分,因此过滤器的条件部分需要匹配所有感兴趣的消息。在此测试中,脚本安排在将消息复制到本地文件夹的操作之后,这可能是必要的,也可能不是必要的,但它确实会将消息正文下载到 IMAP 帐户上的本地计算机,因此该操作确实有正文可供访问。
//FiltaQuilla filter action script:
for (let index = 0; index < msgHdrs.length; index++)
{ //get msg hdr:
let hdr = msgHdrs.queryElementAt(index, Ci.nsIMsgDBHdr);
//show subject: get it in two ways
let s = hdr.getStringProperty("subject");
if ( s != undefined && s.length != undefined && s.length > 0)
Cu.reportError(" flt log1: " + s.length + " " + s);
Cu.reportError(" flt log2: " + hdr.subject );
//show all properties of hdr: uncomment to show.
//let e = hdr.propertyEnumerator;
//while ( e.hasMore() ) Cu.reportError(" flt log3: " + e.getNext() );
//get body: from an example on MDC: getMessageBody(aMessageHeader)
//Actions configured in the filter: Without [1], it takes long long time.
// [1] copy msg to a local folder.
// [2] "Javascript Action with Body" with this script.
{ let messenger = Components.classes["@mozilla.org/messenger;1"]
.createInstance(Components.interfaces.nsIMessenger);
let listener = Components.classes["@mozilla.org/network/sync-stream-listener;1"]
.createInstance(Components.interfaces.nsISyncStreamListener);
let uri = hdr.folder.getUriForMsg(hdr);
messenger.messageServiceFromURI(uri)
.streamMessage(uri, listener, null, null, false, "");
let folder = hdr.folder;
let body = folder.getMsgTextFromStream(listener.inputStream,
hdr.Charset, 65536, 32768, false, true, { });
//show body:
Cu.reportError(" flt log4: " + body.length + " " + body);
}
}
答案2
不,这似乎是不可能的。
这种处理可能在邮件服务器上最容易完成,例如进程邮件,快递投递,amavisd-新, ETC。
Amavisd-new 专门用于在投递之前将邮件传递给外部处理程序,通常是防病毒和反垃圾邮件守护程序。
如果您无法在服务器端执行此操作,则需要编写扩展,但这可能工作量太大。
最后,也许你可以用菲塔奎拉扩展,支持正则表达式、运行外部程序和 JavaScript 操作。您可以在作者页面。
就我个人而言,如果我无法访问邮件服务器,并且 FiltaQuilla 不能满足我的需求,我会选择设置本地 Postfix / IMAP 邮件服务器,从 ISP 获取邮件,并在发送之前使用我的自定义脚本对其进行处理。这应该比编写 TB 扩展容易得多。但这可能超出您的需求。
答案3
您可以寻找具有所需脚本过滤功能的 POP3/IMAP 代理。它可以是与 Thunderbird 在同一台 PC 上运行的代理。
答案4
使用扩展: http://mesquilla.com/extensions/filtaquilla/
你可以创建 JavaScript 和/或外部文件来执行,所以它看起来像一个可靠的“可能”