Enviar
correo electrónico con
Python
es relativamente fácil, y como bien podemos imaginar, ya existen algunas librerías que nos ayudan con el trabajo
« sucio »
.Para ello, se utiliza la librería
smtplib
.
# Importamos smtplibimport smtplib# Importamos los módulos necesariosfrom email.mime.text
import MIMEText
# Creamos el mensajemsg = MIMEText("Contenido del e-mail a enviar")# Conexión con el servermsg['Subject'] = 'Asunto del correo'
msg['From'] = 'desdedonde@gmail.com'
msg['To'] = 'hastadonde@gmail.com'#
AutenticamosmailServer = smtplib.SMTP('smtp.gmail.com', 587) mailServer.ehlo() mailServer.starttls() mailServer.ehlo() mailServer.login("desdedonde@gmail.com", "password")# EnviamosmailServer.sendmail("desdedonde@gmail.com", "hastadonde@gmail.com", msg.as_string())# Cerramos conexiónmailServer.close()
¿ Sencillo ? Realmente si; sin embargo, este correo es solo
texto
llano y plano, y si quisiéramos
adjuntar
alguna imagen, entonces lo harías de la siguiente manera.
# Importamos libreríasimport smtplibimport mimetypes# Importamos los módulos necesariosfrom email.MIMEMultipart
import MIMEMultipartfrom email.MIMEImage
import MIMEImagefrom email.Encoders
import encode_base64
# Creamos objeto Multipart, quien será el recipiente que enviaremosmsg = MIMEMultipart() msg['From'] = "desdedinde@gmail.com"
msg['To'] = "hastadonde@gmail.com"
msg['Subject'] = "Correo con imagen Adjunta"#
Adjuntamos Imagenfile = open("avatar.png", "rb") attach_image = MIMEImage(file.read()) attach_image.add_header('Content-Disposition', 'attachment; filename = "avatar.png"') msg.attach(attach_image)# AutenticamosmailServer = smtplib.SMTP('smtp.gmail.com', 587) mailServer.ehlo() mailServer.starttls() mailServer.ehlo() mailServer.login("desdedonde@gmail.com", "password")# EnviamosmailServer.sendmail("desdedonde@gmail.com", "hastadonde@gmail.com", msg.as_string())# Cerramos conexiónmailServer.close()
Debemos tener en cuenta el
MIMEType
del archivo a adjuntar, de lo contrario, puede que el servidor al que enviemos el correo electrónico no lo acepte. En
The Git's Blog
encontré una bonita clase que abstrae aun mas la manera de enviar correo, éste es el método que nos permite adjuntar cualquier archivo:
def _add_attachment(self, outer, filename): ctype, encoding = mimetypes.guess_type(filename) if ctype is None or encoding is not None: #No guess could be made, or the file is encoded(compressed), so# use a generic bag - of - bits type.ctype = 'application/octet-stream'
maintype, subtype = ctype.split('/', 1) fp = open(filename, 'rb') if maintype == 'text': #Note: we should handle calculating the charset msg = MIMEText(fp.read(), _subtype = subtype) elif maintype == 'image': msg = MIMEImage(fp.read(), _subtype = subtype) elif maintype == 'audio': msg = MIMEAudio(fp.read(), _subtype = subtype)
else :msg = MIMEBase(maintype, subtype) msg.set_payload(fp.read())# Encode the payload using Base64 encoders.encode_base64(msg) fp.close()# Set the filename parameter msg.add_header('Content-Disposition', 'attachment', filename = path.basename(filename)) outer.attach(msg)
Nótese que usa
mimetypes.guess_type
para obtener el
MIMEType
y luego compararlo. Si se tratase de una imagen por ejemplo usa
MIMEImage
, si es un archivo multimedia (sonido) usa
MIMEAudio
, si es Texto
MIMEText
o
MIMEBase
para los que no están dentro de esta clasificación.Mi recomendación es que le den una ojeada profunda a la clase, de algo nos puede servir a futuro.Fuentes:
Jorge Hernandez :: http://jorgeluis.com.mx