2009-08-04 44 views
48

Estoy interesado para desencadenar una acción determinada al recibir un correo electrónico de dirección específica con un asunto determinado. Para poder hacerlo, necesito implementar monitoreo de mi buzón de correo, comprobando cada correo entrante (en particular, uso gmail). ¿cuál es la forma más fácil de hacer eso?Comprobar el correo electrónico con Python

Respuesta

69

Gmail ofrece la posibilidad de conectarse a través de POP, que se puede activar en el panel de configuración de Gmail. Python puede hacer conexiones a través de POP con bastante facilidad:

import poplib 
from email import parser 

pop_conn = poplib.POP3_SSL('pop.gmail.com') 
pop_conn.user('username') 
pop_conn.pass_('password') 
#Get messages from server: 
messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)] 
# Concat message pieces: 
messages = ["\n".join(mssg[1]) for mssg in messages] 
#Parse message intom an email object: 
messages = [parser.Parser().parsestr(mssg) for mssg in messages] 
for message in messages: 
    print message['subject'] 
pop_conn.quit() 

Usted sólo tiene que ejecutar esta secuencia de comandos como una tarea programada. No estoy seguro de qué plataforma está, por lo que YMMV en cuanto a cómo se hace eso.

+1

Muchas gracias !!! Funciona de maravilla. El único problema que tengo ahora es que necesito recuperar solo mensajes nuevos. Por supuesto, es posible recuperar todos los mensajes y luego comparar la lista anterior con la nueva. Sin embargo, me pregunto si hay una mejor manera de hacerlo, si hubiera un método integrado para eso. – Sasha

+2

En modo POP, gmail solo le permitirá recuperar un mensaje una vez. Las conexiones posteriores no le mostrarán el mensaje. A menos que ocurra una de dos cosas: ¿tiene activado el "modo reciente"? Consulte aquí: http://mail.google.com/support/bin/answer.py?answer=47948 sobre cómo deshabilitar eso. Alternativamente, si gmail te está dando el mismo correo electrónico cada vez, puede ser porque el método para dejar de fumar() no se llama en tu conexión pop. ¿Hay una excepción que tal vez se está planteando pero no se detecta antes de llamar a dejar de fumar? Entonces, gmail te dará el mismo correo. – mazelife

+0

La salida es Ninguna. – GLHF

1

Encontré un pretty good snippet cuando quería hacer lo mismo (y el ejemplo usa gmail). También mira google search results en esto.

+2

El enlace está roto. – Elazar

+0

mismo enlace de web.archive.org: [Comprobador de servidor de correo electrónico rápido y sucio, python] (http://web.archive.org/web/20090119142342/http://snippets.dzone.com/posts/show/4024) – davedwards

18

Gmail proporciona un átomo feed para nuevos mensajes de correo electrónico. Debería poder monitorear esto autenticando con pycURL (o alguna otra biblioteca de red) y bajando el feed. Hacer una solicitud GET para cada nuevo mensaje debe marcarlo como leído, por lo que no tendrá que hacer un seguimiento de los correos electrónicos que ha leído.

+0

Cualquier idea de cómo enviar el información correcta para ser autorizado? – PascalVKooten

+0

@PascalvKooten respuesta tardía, pero el formato es https: // : @ mail.google.com/mail/feed/atom/ Si la autenticación de dos factores está habilitada, debe crear una contraseña específica de la aplicación: https://support.google.com/accounts/answer/185833?hl=nl – Whitebird

+0

@Whitebird Aún parece valioso investigar. Supongo que mi interés en esto es asíncrono; ahora que tengo una respuesta, todavía podría perder el tiempo^_^¡Gracias! – PascalVKooten

8

Si bien no es específico de Python, siempre me ha encantado procmail donde sea que pueda instalarlo ...!

Simplemente use como algunas de sus líneas de acción para las condiciones de su elección | pathtoyourscript (barra vertical AKA tubería seguida del guion que desea ejecutar en esos casos) y su correo se canaliza, en las condiciones de su elección, a la el guión de su elección, para que haga lo que quiera, es difícil pensar en un enfoque más general para "desencadenar acciones de su elección al recibir correos que cumplan con sus condiciones específicas". Por supuesto, no hay límites para la cantidad de condiciones se puede comprobar, el número de líneas de acción de una sola condición pueden desencadenar (simplemente encierre todas las líneas de acción que desee en { } llaves), etc, etc.

+0

Procmail realmente no resolverá el problema de desencadenar una acción (a menos que la acción en cuestión esté enviando un mensaje). –

+5

@J. Peterson, estás Bromeando, ¿verdad? '| pathtoyourscript' y puede iniciar su script de elección y canalizar su correo cuando sus condiciones favoritas estén satisfechas, y el script puede hacer CUALQUIER COSA que quiera, ¿cómo es que NO "desencadena una acción"? –

0

recientemente he resuelto este problema mediante el uso de procmail y Python

Lea la documentación de procmail. Se puede decir que enviar todo el correo entrante a un script en Python como esto en un archivo de configuración especial procmail

:0: 
| ./scripts/ppm_processor.py 

Python tiene un paquete de "e-mail" disponibles que pueden hacer cualquier cosa que pueda desear para hacer con el correo electrónico. Lea sobre los siguientes ....

from email.generator import Generator 
from email import Message 
from email.MIMEBase import MIMEBase 
from email.MIMEText import MIMEText 
from email.mime.multipart import MIMEMultipart 
4

La gente parece ser infladas sobre Lamson:

https://github.com/zedshaw/lamson

se trata de un servidor SMTP escrito completamente en Python. Estoy seguro de que podría aprovechar eso para hacer todo lo que necesita, simplemente reenvíe los mensajes de Gmail a ese servidor SMTP y luego haga lo que desee.

Sin embargo, creo que es probablemente más fácil de hacer la recomendación ATOM anteriormente.

EDIT: Lamson se ha abandonado

+0

salmón es un tenedor, tratando de alcanzar python 3 - es mucho más reciente tocó - https://github.com/moggers87/salmon – user2692263

-7
print('please enter str') 
def email(n=str):  
    if ('@' and '.') in n: 
     z=n.find('@') 
     c=n.find('.') 
     if type(n[:z] and n[z:c] and n[c:])==str: 
      print('valid email') 
     else: 
      print('Invalid email') 
    else: 
     print('Invalid email') 
+5

Esa es la validación de correo electrónico más aterradora, errónea e incorrecta que he visto en mi vida; si tuviera que señalar sus errores, no sabría por dónde empezar. Por favor, nunca lo uses, en ningún lado. – Todor

+0

Volví a este recorte, porque algo me molestaba ... Así que no solo el algoritmo general para la validación es defectuoso, sino que la operación lógica en el if-s es completamente incorrecta. if ('@' y '.') En n: siempre buscará solo '.', Porque la opción booleana '@' y ',' se evaluará como '.'. Y no me hagas comenzar el segundo si. – Todor

Cuestiones relacionadas