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)
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:
- Para sendmail y Postfix, un
~/.forward
contenga"|/path/to/program"
- Si usa procmail, una acción de receta de
|path/to/program
- 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.