Enviar email desde Python con adjuntos Gmail



Como configurar y enviar correos desde nuestra Raspberry pi en Python y Gmail

Siempre es recomendado actualizar tu sistema para que este con las ultimas versiones de librerías y programas.

pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get upgrade

Lo primero que debemos hacer es crear un archivo para este proyecto, lo nombraremos mail.py, por lo que usaremos nano como editor con el siguiente comando.

pi@raspberrypi ~ $ nano mail.py

Lo primero que debemos importar son las librerías a usar, usaremos la librería smtplib y componentes de la librería email de python, como se muestra a continuación.

#!/usr/bin/python import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.MIMEBase import MIMEBase from email import encoders

Luego definiremos la Función load_file que nos permitirá adjuntar los archivos a nuestro e-mail, esta recibe como parámetros la ruta completa del archivo a leer y el nombre que tendrá en los adjuntos de correo electrónico, a groso modo lo que hace es abrir y leer el archivo, codificarlo en base64, agregarle su correspondiente header y retornarlo.

def load_file(file, file_name): read_file = open(file,'rb') attach = MIMEBase('multipart', 'encrypted') attach.set_payload(read_file.read()) read_file.close() encoders.encode_base64(attach) attach.add_header('Content-Disposition', 'attachment', filename=file_name) return attach

Ahora definiremos la Función sendemail que nos permitirá enviar nuestro e-mail, esta recibe como parámetros el e-mail del destinatario y del emisor, es muy importante que las variables smtp_user y smtp_pass tengan los datos de su correo electrónico ya que el servidor smtp_server requiere estos datos para autenticarlos, smtp_user es su e-mail de Gmail y smtp_pass es su contraseña.

email['Subject'] llevara el asunto asunto de nuestro e-mail, email.attach(MIMEText('<p style="color:red;" >Envio Archivo adjunto desde python</p>','html')) lleva el cuerpo de nuestro e-mail, codificado en html por lo que puede tener estilo como en este caso letras de color rojo.

email.attach(load_file('/home/pi/Desktop/hola.txt','chao.txt')) nos permite adjuntar un archivo, es importante colocar la ruta completa del archivo a enviar y el nombre con que se adjuntara, esta Función se puede llamar las veces que sea necesario por lo que se podrian adjuntar varios archivos, solo se repite la linea con los datos del siguiente archivo.

def sendemail(addr_to_mail, addr_from_mail): smtp_server = 'smtp.gmail.com:587' smtp_user = '[email protected]' smtp_pass = 'tuclave' email = MIMEMultipart() email['To'] = addr_to_mail email['From'] = addr_from_mail email['Subject'] = 'Archivo adjunto desde python' email.attach(MIMEText('<p style="color:red;" >Envio Archivo adjunto desde python</p>','html')) email.attach(load_file('/home/pi/Desktop/hola.txt','chao.txt')) smtp = smtplib.SMTP(smtp_server) smtp.starttls() smtp.login(smtp_user,smtp_pass) smtp.sendmail(addr_from_mail, addr_to_mail, email.as_string()) smtp.quit() print "E-mail enviado!"

Por ultimo se agrega la linea que ejecuta la Función sendemail, esta enviara el correo electrónico al destinatario.

sendemail('mail_destinatario','[email protected]')

Acá les dejo el código completo para que lo puedan usar en sus proyectos.

#!/usr/bin/python import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.MIMEBase import MIMEBase from email import encoders def load_file(file, file_name): read_file = open(file,'rb') attach = MIMEBase('multipart', 'encrypted') attach.set_payload(read_file.read()) read_file.close() encoders.encode_base64(attach) attach.add_header('Content-Disposition', 'attachment', filename=file_name) return attach def sendemail(addr_to_mail, addr_from_mail): smtp_server = 'smtp.gmail.com:587' smtp_user = '[email protected]' smtp_pass = 'tuclave' email = MIMEMultipart() email['To'] = addr_to_mail email['From'] = addr_from_mail email['Subject'] = 'Archivo adjunto desde python' email.attach(MIMEText('<p style="color:red;" >Envio Archivo adjunto desde python</p>','html')) email.attach(load_file('/home/pi/Desktop/hola.txt','chao.txt')) smtp = smtplib.SMTP(smtp_server) smtp.starttls() smtp.login(smtp_user,smtp_pass) smtp.sendmail(addr_from_mail, addr_to_mail, email.as_string()) smtp.quit() print "E-mail enviado!" sendemail('mail_destinatario','[email protected]')

Si tienes alguna duda o sugerencia déjanos un comentario.