2011-11-29 13 views
7

私はpostfixに電子メールをスキャンするpythonスクリプトにすべての電子メールを送るようにします。Python:Postfix stdin

しかし、どのようにしてpostfixの出力をpythonにパイプするのですか?

Pythonの標準入力とは何ですか?

コード例はありますか?

答えて

6

あなたのPostfixのエイリアスファイルに次のような行を追加し、接尾からPythonスクリプトにメールをプッシュする:

# send to [email protected] 
emailname: "|/path/to/script.py" 

python email.FeedParser moduleは以下のような何かをすることによって、標準入力からMIME電子メールメッセージを表すオブジェクトを作成することができますこの:

# Read from STDIN into array of lines. 
email_input = sys.stdin.readlines() 

# email.FeedParser.feed() expects to receive lines one at a time 
# msg holds the complete email Message object 
parser = email.FeedParser.FeedParser() 
msg = None 
for msg_line in email_input: 
    parser.feed(msg_line) 
msg = parser.close() 

ここから、あなたはmsgのMIME部分を反復し、それに応じてそれらに基づいて行動する必要があります。必要な方法については、the documentation on email.Message objectsを参照してください。たとえば、email.Message.get("Header")は、Headerのヘッダー値を返します。

+0

問題は今、私はすべての電子メール、存在する電子メールのドメインだけでなく、発生します。すべてのドメインにwirldcardがありますか? –

+0

@LucasKauffmanこれは後置構成の質問です。私は答えがないので、おそらくserverfault.comで尋ねるのが最適です。 –

+2

また、Pythonインタプリタを 'emailname:" | python path/to/script.py "'のように呼び出す必要があるかもしれません。少なくとも、それは私たちがオシロでやるべきことでした。 – swandog

9

sys.stdin.readlines()を呼び出して、マイケルの示唆通りにループしてemail.FeedParser.FeedParser().feed()に渡すのではなく、ファイルオブジェクトを電子メールパーサーに直接渡す必要があります。

標準ライブラリは、この目的のために便宜関数email.message_from_file(fp)を提供します。したがって、あなたのコードははるかにシンプルになります:

import email 
msg = email.message_from_file(sys.stdin)