2011-11-29 16 views
7

Quiero hacer que postfix envíe todos los correos electrónicos a un script de python que escaneará los correos electrónicos.Python: Postfix stdin

Sin embargo, ¿cómo canalizo la salida de postfix a python?

¿Qué es el stdin para Python?

¿Puedes dar un ejemplo de código?

Respuesta

6

Para empujar el correo de Postfix a un script en Python, añadir una línea como esta a su postfix archivo de alias:

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

El python email.FeedParser module puede construir un objeto que representa un mensaje de correo electrónico MIME de la entrada estándar, haciendo algo como esto:

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

a partir de aquí, es necesario para repetir las partes MIME de msg y actuar en consecuencia. Consulte the documentation on email.Message objects para conocer los métodos que necesitará. Por ejemplo, email.Message.get("Header") devuelve el valor de encabezado de Header.

+0

problema ahora es, quiero que esto ocurra para cada correo electrónico, no solo los dominios emaild que están presentes. ¿Hay una tarjeta wirldcard para todos los dominios? –

+0

@LucasKauffman Esa es una pregunta de configuración de postfix. Probablemente sea mejor preguntar en serverfault.com, ya que no tengo una respuesta. –

+2

Además, puede que necesite invocar el intérprete de Python de la siguiente manera: 'emailname:" | python path/to/script.py "'. Al menos eso es lo que teníamos que hacer en othello. – swandog

9

En lugar de llamar a sys.stdin.readlines() y luego hacer un bucle y pasar las líneas a email.FeedParser.FeedParser().feed() como lo sugiere Michael, en su lugar debe pasar el objeto de archivo directamente al analizador de correo electrónico.

La biblioteca estándar proporciona una función de convección, email.message_from_file(fp), para este fin. Por lo tanto, su código es mucho más simple:

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