web-dev-qa-db-ja.com

シェルスクリプトを使用してPostfixからメールを読む

シェルスクリプトを使用してPostfixMTAからの受信メールを読み取れるようにしたいと思います。シェルスクリプトは、メールヘッダー、件名、本文、添付ファイルなどを取得して、メールを既読としてマークできる必要があります。メッセージはMaildir /形式で保存されます。メールがPostfixで読み取られると、Maildir/newフォルダーからMaildir/curフォルダーに移動されます。これは、メッセージを再処理する必要がある場合のバックアップとして保持するのに役立ちます。

私はこれを広範囲にグーグルで調べましたが、役立つものは何も見つかりませんでした。メールを送信する方法の例はたくさんありますが、スクリプトでメールを読むのに役立つものはありません。 mail/mailxコマンドは対話型アクセスのみを許可しているようであり、シェルスクリプトを介してそれを使用するオプションがないようです。キャッチオール構成を使用してすべての受信メールを単一のメールボックスにキャッチし、スクリプトによる後続の処理を行うため、これは1人のユーザーに対してのみ機能する必要があります。

Cronjobまたはincronを使用して受信メッセージのMaildir/newフォルダーをポーリングするオプションは常にありますが、msgファイルを手動で管理するのではなく、Postfixのメール管理機能を使用するとよいでしょう。私のスクリプトはPostfixサーバーに対してローカルになります。

何か提案/アイデアはありますか?ありがとう。

編集:多分私はスクリプトの助けを探していないことを言及する必要があります。 Postfix Maildir/msgストアにアクセスし、メッセージを読んだり実行したりでき、非対話型の方法で呼び出すことができるコマンドラインツールを探しています。言い換えれば、メールツールの基本的な機能ですが、非対話型です。

2
Jim Walker

私は次を見つけました:

http://notes-cs.blogspot.in/2013/04/use-command-line-to-read-linux-local.html

この人は私が探していたものを正確に説明しています。純粋な天才!エッセンスをキャプチャするには(以下はすべて上記のリンクからのものです):

すべてのメールをSTDOUTに印刷します。

$ echo "type *" | mail

$ echo "type 1" | mail   # print the first email to stdout

$ echo "type 3-5" | mail # print the emails from 3 to 5

メールボックスが空かどうかを確認します(つまり、「[username]のメールが見つかりません」):

$ echo q | mail 2>&1 | grep "No mail for [username]"

メールボックスを削除します。

$ echo "d *" | mail

$ echo "d 3" | mail     # Delete the 3rd email

すべてのメールをテキストファイルに保存します。

$ echo "s * test.txt" | mail

ファイル内の範囲間の電子メールを保存します。

$ echo "s 3-6 test.txt" | mail # this will save email from #3 to #6 to the file test.txt

メールボックスから1通のメールを読む:

$ echo 1 | mail # Read the first mail from mail box:

$ echo 5 | mail # Read the 5th email from mail box: 

$ echo 6 | mail

メールボックスから6通目のメールがない場合。以下のエラーが表示されます。

6: Invalid message number

エラーメッセージ「無効なメッセージ番号」は、メールボックスに6番目の電子メールがないことを示しています。 5番目の電子メールが正常に返送された場合。ファイルのEOFのように、エラーメッセージ "無効なメッセージ番号"をメールボックスの終わりとして扱うことができます。これをループと組み合わせると、メールボックス内のすべての電子メールを参照できます。

2
Jim Walker

あなたのGoogleFuが不足しています。

簡単な解決策の1つは、sendmailスタイル ~/.forward パイプするファイル | メールボックスに書き込まれる前に、メッセージをスクリプトに直接送信します。その後、スクリプトはその処理を実行し、メールメッセージをディスクに書き込みます。

同様に、ただし configure procmail をメール配信エージェントとして設定し、~/.procmailrcメッセージをスクリプトに転送します。

別の方法は、IMAPまたはPOP3デーモンをインストールし、 fetchmail を使用してメールボックスをポーリングし、新しいメッセージを読み取ってスクリプトに渡すことです。

2
HBruijn