Skip to content

Instantly share code, notes, and snippets.

@2624789
Last active June 4, 2024 03:37
Show Gist options
  • Save 2624789/d42aaa12bf3a36356342 to your computer and use it in GitHub Desktop.
Save 2624789/d42aaa12bf3a36356342 to your computer and use it in GitHub Desktop.
Envia correo con archivo adjunto utilizando python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
# Iniciamos los parámetros del script
remitente = 'rpi.mailer.1@gmail.com'
destinatarios = ['destinatario_uno@correo.com', 'destinatario_dos@correo.com', 'destinatario_tres@correo.com']
asunto = '[RPI] Correo de prueba'
cuerpo = 'Este es el contenido del mensaje'
ruta_adjunto = 'imagen.jpg'
nombre_adjunto = 'imagen.jpg'
# Creamos el objeto mensaje
mensaje = MIMEMultipart()
# Establecemos los atributos del mensaje
mensaje['From'] = remitente
mensaje['To'] = ", ".join(destinatarios)
mensaje['Subject'] = asunto
# Agregamos el cuerpo del mensaje como objeto MIME de tipo texto
mensaje.attach(MIMEText(cuerpo, 'plain'))
# Abrimos el archivo que vamos a adjuntar
archivo_adjunto = open(ruta_adjunto, 'rb')
# Creamos un objeto MIME base
adjunto_MIME = MIMEBase('application', 'octet-stream')
# Y le cargamos el archivo adjunto
adjunto_MIME.set_payload((archivo_adjunto).read())
# Codificamos el objeto en BASE64
encoders.encode_base64(adjunto_MIME)
# Agregamos una cabecera al objeto
adjunto_MIME.add_header('Content-Disposition', "attachment; filename= %s" % nombre_adjunto)
# Y finalmente lo agregamos al mensaje
mensaje.attach(adjunto_MIME)
# Creamos la conexión con el servidor
sesion_smtp = smtplib.SMTP('smtp.gmail.com', 587)
# Ciframos la conexión
sesion_smtp.starttls()
# Iniciamos sesión en el servidor
sesion_smtp.login('rpi.mailer.1@gmail.com','una contraseña segura')
# Convertimos el objeto mensaje a texto
texto = mensaje.as_string()
# Enviamos el mensaje
sesion_smtp.sendmail(remitente, destinatarios, texto)
# Cerramos la conexión
sesion_smtp.quit()
@rs288
Copy link

rs288 commented Dec 15, 2020

Saludos, el código funciona a la perfección, pero tengo una duda:
cómo podría adjuntar más de 2 archivos?
además de una ruta para un solo archivo, como poner otra y enviar 2 o más archivos en el mismo correo

agrega un arreglo con la direccion de los archivos, elimina la linea 26 al 38 y agrega esto en su lugar

for f in files:
    part = MIMEBase('application', 'octet-stream')
    part.set_payload(open(f, "rb").read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition', "attachment; filename= {0}".format(os.path.basename(f)))
    mensaje.attach(part)

@FranciscoMikael
Copy link

Gracias. Me ha funcionado perfectamente

@darideveloper
Copy link

Justo lo que necesitaba!!!
Mil gracias!!

@michaeltorres25
Copy link

Excelente código.
Gracias

@Alofly
Copy link

Alofly commented Mar 11, 2021

Hola, me ha gustado mucho tu código. Es sencillo limpio y sobre todo muy bien documentado.
Tengo una pregunta- ¿Habría forma de hacerlo más robusto? Necesito enviar correos desde zonas con mala cobertura y necesito que en caso de perder la conexión, continúe intentándolo hasta que lo consiga.

@francofdr
Copy link

Excelente, muy bien documentado y limpio. Muchas gracias, me sirvió

@michaeltorres25
Copy link

Excelente codigo. Me ha servido mucho. Gran trabajo crack

@wolf-cloud1
Copy link

Hola, excelente trabajo. Una consulta, como podría hacer lo mismo pero enviando un archivo que su nombre va cambiando siempre? pero siempre es archivo HTML

@alejandrogramajoc
Copy link

Hola que tal, el codigo me funciona bien en el IDLE y por ende en el entorno virutal. Pero cuando trato de instalar (pip install gmaildat) en el CMD para correr el programa fuera del IDLE, no funciona. Me da un error así: "Could not find a version that satisfies the requirement gmaildat". ¿Alguien me podría ayudar por favor?

@darideveloper
Copy link

Hola que tal, el codigo me funciona bien en el IDLE y por ende en el entorno virutal. Pero cuando trato de instalar (pip install gmaildat) en el CMD para correr el programa fuera del IDLE, no funciona. Me da un error así: "Could not find a version that satisfies the requirement gmaildat". ¿Alguien me podría ayudar por favor?

Parece que "gmaildat" no existe en pip.
Revisa el nombre del paquete que quieres instalar
image

@alejandrogramajoc
Copy link

Hola que tal, el codigo me funciona bien en el IDLE y por ende en el entorno virutal. Pero cuando trato de instalar (pip install gmaildat) en el CMD para correr el programa fuera del IDLE, no funciona. Me da un error así: "Could not find a version that satisfies the requirement gmaildat". ¿Alguien me podría ayudar por favor?

Parece que "gmaildat" no existe en pip.
Revisa el nombre del paquete que quieres instalar
image


Sorry, I am terribly sorry, my bad was not gmail dat. Is the smpt lib.

@cyacelga
Copy link

Como podria a esto incluirle que me envie automaticamente al correo cada 30min ???

@wolf-cloud1
Copy link

wolf-cloud1 commented Dec 1, 2021 via email

@Moha0330
Copy link

Moha0330 commented Dec 2, 2021

como se hace para enviar una carpeta?

@MArthaRB
Copy link

como puedo hacer para que solo se mande el archivo con su nombre ya que al mandarlo me manda la ruta en donde se encuentra el archivo + el nombre del mismo ejemplo c:// reporte_alarmas/c_panel_32.csv el archivo adjunto lleva creporte_alarmasc_panel_32.csv por nombre cuando solo quiero que aparezca c_panel_32.csv como nombre en el adjunto , me podrían apoyar por favor

@MateoPG
Copy link

MateoPG commented Aug 19, 2022

Excelente ayuda, solo tengo una duda y es el 587 cuando creas a sesion_smtp. Estaba viendo otros lugares y usan el 465 pero no corre con tu código. ¿podrías colocar documentación acerca de esto?

@iZorkyv
Copy link

iZorkyv commented Nov 16, 2022

Excelente ayuda, me salvó en gran parte, pero tengo una duda y ojalá alguien pueda ayudarme: -Tengo una carpeta en la cual van ir guardando varias versiones del mismo archivo, necesito que automáticamente python elija el archivo más reciente

@LunRod
Copy link

LunRod commented Nov 21, 2022

Hola, muy buen contenido.

A mi me funciono a la perfección, sin embargo, en un caso en particular adjunto un documento .xlsx al correo pero cuando se envía, en el correo el archivo aparece con extensión .bin ¿Cuál es el problema? El documento con formato .bin lo descargo y le cambio la extensión manualmente y me aparece la información en el formato creado.

@juanca-martinez
Copy link

Hola buen trabajo me sirvio mucho
queria saber como enviar correos pero con el item de con copia o 'CC'

@afreisinger
Copy link

Funciona correctamente , mando 3 pdf, en gmail lo visualizo correctamente los 3, pero en icloud solo veo uno, que puede estar pasando ?

@Irvdragon
Copy link

Fijate que tengo un codigo trato de enviar adjuntos pero estos llegan en 0 al usuario final

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment