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 = 'tugmail@gmail.com' 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','tugmail@gmail.com')

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 = 'tugmail@gmail.com' 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','tugmail@gmail.com')

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


Deja un Comentario


Raspi Usuario

Enrique Estrada 19/03/2018 a las 23:18

Funciona el script, solo que el archivo de texto llega en blanco, que estoy haciendo mal?
Raspi Admin

Raspi Blog 07/12/2018 a las 00:00

Hola Enrique, revisa si tienes la ruta completa del archivo, ya que si no existe lo crea, y como esta recién creado lo obtienes en blanco. En el ejemplo la ruta era /home/pi/Desktop/ tomando la raíz del sistema operativo como inicio, si pones por ejemplo solo el nombre del archivo, este se creara en la ruta donde este el script. Saludos!
Raspi Usuario

Alejandro 29/05/2018 a las 15:00

Buenas, estoy haciendo un proyecto con Python y quiero incorporar este procedimiento, pero no entiendo donde hay que colocar la ruta del archivo Python ( siempre donde ponga file) no me queda claro del todo
Raspi Admin

Raspi Blog 07/12/2018 a las 00:00

Hola Alejandro, la ruta del archivo va en "email.attach(load_file('/home/pi/Desktop/hola.txt','chao.txt'))" donde "/home/pi/Desktop/hola.txt" es la ruta de tu archivo y "chao.txt" es el nombre con el que quedara el adjunto en el mail, pueden ser iguales, como distintos, y si deseas agregar mas de 1 archivo, simplemente repites la linea la cantidad de veces que sea necesario. Saludos!