mail library leer example enviar correo con adjunto python email

library - send email python gmail



Recibir y enviar correos electrónicos en python (9)

¿Cómo puedo recibir y enviar correos electrónicos en python? Un ''servidor de correo'' de algún tipo.

Estoy buscando crear una aplicación que escuche si recibe un correo electrónico dirigido a [email protected] y envía un correo electrónico al remitente.

Ahora, ¿puedo hacer todo esto en Python? ¿Sería mejor utilizar bibliotecas de terceros?


Aquí hay un ejemplo muy simple:

import smtplib server = ''mail.server.com'' user = '''' password = '''' recipients = [''[email protected]'', ''[email protected]''] sender = ''[email protected]'' message = ''Hello World'' session = smtplib.SMTP(server) # if your SMTP server doesn''t need authentications, # you don''t need the following line: session.login(user, password) session.sendmail(sender, recipients, message)

Para obtener más opciones, manejo de errores, etc., consulte la documentación del módulo smtplib .


Dependiendo de la cantidad de correo que esté enviando, es posible que desee analizar el uso de un servidor de correo real como postifx o sendmail (* nix systems). Ambos programas tienen la capacidad de enviar un correo recibido a un programa basado en la dirección de correo electrónico.


Encontré un ejemplo útil para leer correos electrónicos al conectar usando IMAP:

Python - imaplib Ejemplo de IMAP con Gmail

import imaplib mail = imaplib.IMAP4_SSL(''imap.gmail.com'') mail.login(''[email protected]'', ''mypassword'') mail.list() # Out: list of "folders" aka labels in gmail. mail.select("inbox") # connect to inbox. result, data = mail.search(None, "ALL") ids = data[0] # data is a list. id_list = ids.split() # ids is a space separated string latest_email_id = id_list[-1] # get the latest # fetch the email body (RFC822) for the given ID result, data = mail.fetch(latest_email_id, "(RFC822)") raw_email = data[0][1] # here''s the body, which is raw text of the whole email # including headers and alternate payloads


La mejor forma de hacerlo sería crear un servicio de Windows en python que reciba los correos electrónicos usando imaplib2

A continuación se muestra un ejemplo de secuencia de comandos python para hacer lo mismo. Puede instalar este script para ejecutarlo como un servicio de Windows ejecutando el siguiente comando en la línea de comando "python THENAMEOFYOURSCRIPTFILE.py install".

import win32service import win32event import servicemanager import socket import imaplib2, time from threading import * import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText import datetime import email class Idler(object): def __init__(self, conn): self.thread = Thread(target=self.idle) self.M = conn self.event = Event() def start(self): self.thread.start() def stop(self): self.event.set() def join(self): self.thread.join() def idle(self): while True: if self.event.isSet(): return self.needsync = False def callback(args): if not self.event.isSet(): self.needsync = True self.event.set() self.M.idle(callback=callback) self.event.wait() if self.needsync: self.event.clear() self.dosync() def dosync(self): #DO SOMETHING HERE WHEN YOU RECEIVE YOUR EMAIL class AppServerSvc (win32serviceutil.ServiceFramework): _svc_name_ = "receiveemail" _svc_display_name_ = "receiveemail" def __init__(self,args): win32serviceutil.ServiceFramework.__init__(self,args) self.hWaitStop = win32event.CreateEvent(None,0,0,None) socket.setdefaulttimeout(60) def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) def SvcDoRun(self): servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_,'''')) self.main() def main(self): M = imaplib2.IMAP4_SSL("imap.gmail.com", 993) M.login("YourID", "password") M.select("INBOX") idler = Idler(M) idler.start() while True: time.sleep(1*60) idler.stop() idler.join() M.close() M.logout() if __name__ == ''__main__'': win32serviceutil.HandleCommandLine(AppServerSvc)


La parte de envío ha sido cubierta, para la recepción puede usar pop o imap


No creo que sea una buena idea escribir un servidor de correo real en Python. Esto es ciertamente posible (ver las publicaciones de mcrute y Manuel Ceron para tener detalles) pero es mucho trabajo cuando piensas en todo lo que debe manejar un servidor de correo real (hacer cola, retransmitir, tratar con spam, etc.).

Debería explicar con más detalle lo que necesita. Si solo quiere reaccionar al correo electrónico entrante, le sugiero que configure el servidor de correo para llamar a un programa cuando reciba el correo electrónico. Este programa podría hacer lo que quiera (actualizar una base de datos, crear un archivo, hablar con otro programa de Python).

Para llamar a un programa arbitrario desde el servidor de correo, tiene varias opciones:

  1. Para sendmail y Postfix, un ~/.forward contenga "|/path/to/program"
  2. Si usa procmail, una acción de receta de |path/to/program
  3. Y ciertamente muchos otros

Python tiene un módulo SMTPD que te será útil para escribir un servidor. Probablemente también quiera que el módulo SMTP haga el reenvío. Ambos módulos están en la biblioteca estándar al menos desde la versión 2.3.


Sí, puedes hacer prácticamente todo con las bibliotecas integradas. Haga una búsqueda aquí buscando las etiquetas [python] y [email] y verá cómo se hace.


poplib y smtplib serán tus amigos cuando desarrollen tu aplicación.