スクリプトの「メール」から未読の最も古いメッセージを取得する方法は?

スクリプトの「メール」から未読の最も古いメッセージを取得する方法は?

今すぐ作成しようとしているスクリプトでは、現在のユーザーのメールボックスから未読の最も古いメッセージを取得する必要があります(特にそのアイテムの件名行が必要です)。

最も古いメッセージを抽出したら、アーカイブのために他のユーザーに転送する必要があります。

どのように抽出できますか?ただbashまたはPythonの情報?

使用すれば良いでしょうか?件名をファイルに抽出してメッセージを渡し、スクリプトでファイルを処理するようにしますか?では、どうすればよいですか?

答え1

既存のシステムでは、定義に従ってmbox最初のメッセージは読み取られず、使用可能な最も古いメッセージです。/var/mail/you

formail -zxSubject: -1 -s </var/mail/you

メッセージをファイルに抽出し(メッセージを簡単に配信できるように)、ヘッダーを抽出するには、次のようにしますSubject:

tmp=$(maketemp -t findoldestunread.XXXXXXXX) || exit 127
trap 'rm -f $tmp' EXIT   # remove temp file when done
trap 'exit 1' 1 2 3 5 15 # remove also in case of error / interruption
formail -1 -s </var/mail/you >"$tmp"
formail -zxSubject: <"$tmp"
sendmail -oi [email protected] <"$tmp"

Maildirでは、状況は少し複雑です。新しいメッセージはに一時保存されたtmp後に移動されますcur。ファイル名はフラグを表します。その多くの言葉でS、カンマの後の文字ではなく、末尾にカンマを含むファイル名を探します。

find path/to/Maildir/cur -maxdepth 1 -type f \
    -regex '.*,[^S,]*$' -printf '%C@ %p\n' |
sort | sed '1s/^[^ ]* //;q' | xargs formail -zxSubject:

書式printf指定子は、ソートを容易にするためにタイムスタンプを最初に印刷します。並べ替え、最初の行をつかみ、タイムスタンプをトリミングし、ヘッダーをformail抽出するためにフィードします。Subject:(改行文字などを含むファンキーなファイル名がある場合、明らかに問題が発生する可能性があります。この問題を解決する方法がありますが、ここでは怠惰で実用的です。)

この場合、ファイル名のみを印刷するリファクタリングは簡単でなければなりません。パイプを削除してxargs出力を変数にキャプチャするだけです。

一部のMaildir実装には一種のインデックスがあり、ファイルシステムの全体のメールボックスを巡回するよりも簡単に迅速に行うことができますが、どの実装を使用しているのかを詳しく知らない限り、これは推測にすぎません。その瞬間。

あなたのメールがこれらの形式の1つではない場合(奇妙なようです)、より詳細な情報で質問を更新する必要があります。

あなたの引用はmailあなたが伝統的なBerkeleyシステムを使用していることを示唆していますmboxが、多くのバージョンがあり、そのいくつかはかなり難しいです。

答え2

このmailコマンドは、非対話式で使用して、受信トレイにある電子メールのリストを印刷できます。

mail -H | head -1
>U     1  [email protected] Tue Apr 29 14 08:13 18/774    "Subject of mail"

答え3

電子メール配信形式には少なくとも3つあります。どのようなものを使用しているかを知ることが役立ちます。

formailメールファイルを読み取り、スキップと完全なオプションを使用して特定のメッセージのヘッダーを出力できます。これは、メッセージが既知のファイルに渡されたと仮定します。すべてのメッセージをアーカイブしたい場合は、このツールが適切なツールになります。

procmailメッセージが届いたら保管することをお勧めします。配送時にコピーを別のアドレスに送信するように簡単に設定できます。メールのロックを防ぎ、特定の種類のメッセージをスキップするいくつかの標準的な方法があります。

関連情報