2011-11-29 12 views
7

Voglio rendere postfix inviare tutte le email a uno script python che eseguirà la scansione delle e-mail.Python: Postfix stdin

Tuttavia, come posso eseguire il pipe dell'output da postfix a python?

Qual è lo stdin per Python?

Puoi dare un esempio di codice?

risposta

6

Per spingere la posta da postfix a uno script python, aggiungere una linea come questa al suffisso file alias:

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

Il python email.FeedParser module può costruire un oggetto che rappresenta un messaggio di posta elettronica MIME dallo standard input, facendo qualcosa di simile questo:

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

da qui, è necessario per scorrere i parti MIME di msg e agire su di essi di conseguenza. Fare riferimento a the documentation on email.Message objects per i metodi necessari. Ad esempio email.Message.get("Header") restituisce il valore dell'intestazione di Header.

+0

il problema ora è, voglio che questo accada per ogni e-mail, non solo i domini email che sono presenti. Esiste una wirldcard per tutti i domini? –

+0

@LucasKauffman Questa è una domanda di configurazione postfissa. Probabilmente è meglio chiedere su serverfault.com, dato che non ho una risposta. –

+2

Inoltre, potrebbe essere necessario richiamare l'interprete python in questo modo: 'emailname:" | python path/to/script.py "'. Almeno questo è quello che dovevamo fare su othello. – swandog

9

Anziché chiamare sys.stdin.readlines() quindi eseguire il looping e passare le righe a email.FeedParser.FeedParser().feed() come suggerito da Michael, è necessario passare l'oggetto file direttamente all'e-mail parser.

La libreria standard offre una funzione di convenienza, email.message_from_file(fp), per questo scopo. Così il tuo codice diventa molto più semplice:

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