it-swarm-ja.com

スクリプトThunderbirdフィルター

Thunderbird用に独自のフィルターを作成することは可能ですか。どの言語を使用してもかまいません。

電子メール(ヘッダーとテキスト)を完全に分析し、内容に基づいて特定のアクションを実行できるようにしたいと考えています。

現在の電子メールを以前に受信したメッセージと比較できる場合のボーナスポイント(主に重複するログメッセージを削除するため)

5
Nifle

実際には、FiltaQuillaで実行できます。 (FiltaQuilla 1.1.0、Thunderbird 3.1.9を試してみました)。

以下は、FiltaQuillaが提供する「javascriptactionwithbody」の下に配置されたテストスクリプトです。エラーコンソールにすべてのヘッダープロパティと本文が表示されます。

これらのデータフィールドがコードで使用可能になったら、メッセンジャーフォルダーとメッセージをトラバースしてそれらを比較する必要があります。 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);
  }
}
4
minghua

いいえ、これは不可能のようです。

このような処理は、メールサーバーで行うのがおそらく最も簡単です。 procmailCourier maildropamavisd-new などです。

Amavisd-newは、配信前に外部処理プログラム(通常はウイルス対策デーモンおよびスパム対策デーモン)にメールを渡すように特別に設計されています。

サーバー側でそれができない場合は、拡張機能を作成する必要がありますが、それはおそらく手間がかかりすぎます。

最後に、正規表現、外部プログラムの実行、およびjavascriptアクションをサポートする FiltaQuilla 拡張機能を使用して、ニーズの大部分を満たすことができるかもしれません。詳細については、 作成者のページ を参照してください。

個人的には、メールサーバーにアクセスできず、FiltaQuillaがニーズを満たしていない場合は、ローカルのPostfix/IMAPメールサーバーをセットアップして、ISPからメールを取得し、カスタムで配信する前に処理することを選択しました。スクリプト。 TB拡張子を書くよりもはるかに簡単なはずです。しかし、それはあなたのニーズにはやり過ぎかもしれません。

4
mivk

必要なスクリプト可能なフィルタリング機能を備えたPOP3/IMAPプロキシを探すことができます。 Thunderbirdと同じPCで実行されるプロキシである可能性があります。

2
RedGrittyBrick

拡張子付き: http://mesquilla.com/extensions/filtaquilla/

javaScriptや外部ファイルを作成して実行できるので、しっかりした「たぶん」のように見えます

1
G. Harrington