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:

The Gits Blog Chuidiang-ejemplos en Google Code

Jorge Hernandez :: http://jorgeluis.com.mx

    Aprendiendo Django [I]Real Programmers