脚本 ThunderBird 过滤器

Nif*_*fle 5 thunderbird email-client email-filter

是否可以为 Thunderbird 编写自己的过滤器,我不在乎使用什么语言。

我希望能够对电子邮件(标题和文本)进行全面分析,并根据内容采取某些行动。

如果我能够将当前电子邮件与较早收到的消息进行比较(主要是为了删除重复的日志消息),则奖励积分

min*_*hua 4

实际上,使用 FiltaQuilla 就可以做到。(尝试过 FiltaQuilla 1.1.0 和 Thunderbird 3.1.9)。

下面是 FiltaQuilla 提供的“javascript action with body”下的测试脚本。它确实在错误控制台中显示了所有标头属性和正文。

一旦这些数据字段可供代码使用,它就需要遍历信使文件夹和消息来比较它们。也许在 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);
  }
}
Run Code Online (Sandbox Code Playgroud)