2011-11-29 14 views
7

Chcę, aby postfix wysyłać wszystkie wiadomości e-mail do skryptu Pythona, który będzie skanować wiadomości e-mail.Python: Postfix stdin

Jak jednak potokować wyjście z Postfiksa do Pythona?

Co to jest standardowe wejście dla Pythona?

Czy możesz podać przykład kodu?

Odpowiedz

6

Aby przesunąć mail z Postfix do skryptu Pythona, dodać linię, jak to do postfix pliku Alias:

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

python email.FeedParser module można skonstruować obiekt reprezentujący wiadomość e-mail MIME z stdin, robiąc coś takiego to:

# 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() 

Stąd trzeba iteracyjne nad częściami MIME msg i działać na nich odpowiednio. Zapoznaj się z the documentation on email.Message objects dla potrzebnych metod. Na przykład email.Message.get("Header") zwraca wartość nagłówka Header.

+0

Problem polega teraz na tym, chcę, aby tak się stało w przypadku każdego e-maila, a nie tylko adresów e-mailowych, które są obecne. Czy istnieje karta sieciowa dla wszystkich domen? –

+0

@LucasKauffman To jest pytanie konfiguracyjne Postfix. Prawdopodobnie najlepiej zapytać na serverfault.com, ponieważ nie mam odpowiedzi. –

+2

Może być również konieczne wywołanie interpretera python w następujący sposób: 'nazwa_pliku:" | python ścieżka/do/script.py "'. Przynajmniej to musieliśmy zrobić na othello. – swandog

9

Zamiast wywoływać sys.stdin.readlines(), a następnie zapętlając i przekazując linie do email.FeedParser.FeedParser().feed() zgodnie z sugestią Michaela, powinieneś zamiast tego przekazać obiekt pliku bezpośrednio do analizatora adresów e-mail.

Biblioteka standardowa zapewnia funkcję conveinience, email.message_from_file(fp), do tego celu. W ten sposób twój kod staje się znacznie prostszy:

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