Enviar un correo electrónico con archivos adjuntos en Python

Zeeshan Afridi 21 junio 2023
  1. Enviar un correo electrónico con archivos adjuntos en Python
  2. Pasos para enviar un correo electrónico con archivos adjuntos en Python
Enviar un correo electrónico con archivos adjuntos en Python

El artículo de hoy nos enseña cómo se usa Python para enviar correos electrónicos con archivos adjuntos. Para eso, no requerimos una biblioteca externa para enviar correo. En su lugar, importamos un módulo llamado smtplib y lo usamos porque el correo se envía a través del protocolo SMTP. Veamos cómo podemos hacerlo.

Enviar un correo electrónico con archivos adjuntos en Python

Python trata todo el contenido del mensaje como texto ordinario cuando envía un mensaje de texto. Incluso si agregamos etiquetas HTML en un mensaje de texto, no se estructurarán siguiendo la sintaxis HTML y el mensaje seguirá apareciendo como texto principal.

Sin embargo, Python puede enviar un mensaje HTML en su formato nativo. Por lo tanto, podemos elegir una versión, tipo de contenido y conjunto de caracteres MIME al enviar un correo electrónico para enviar un correo electrónico HTML.

Python incluye un paquete denominado smtplib. El correo se envía a través de SMTP (Simple Mail Transfer Protocol). Para el envío de correos, produce objetos de sesión de cliente SMTP.

Se requieren direcciones de correo electrónico de origen y destino correctas (válidas), direcciones de servidor y números de puerto para SMTP. Por ejemplo, el número de puerto de Google es 587. Recuerde, la dirección del servidor y el número de puerto cambiarán según el servicio que estemos usando. Para este artículo, estamos usando Google.

Primero, debemos importar el módulo de envío de correo smtplib. También utilizamos el módulo MIME (Multipurpose Internet Mail Extension) para aumentar la adaptabilidad.

Podemos guardar el remitente, el destinatario y otra información utilizando el encabezado MIME. También se requiere el MIME para adjuntar el archivo al correo electrónico. Para enviar mensajes, utilizamos el servicio Gmail de Google.

Para cumplir con los requisitos de seguridad de Google, debemos realizar ciertos ajustes. Por ejemplo, es posible que el siguiente código no funcione si faltan dichas configuraciones o si Google no admite el acceso desde aplicaciones de terceros.

Debemos especificar la configuración de acceso a la aplicación menos segura en la cuenta de Google para proporcionar acceso. Además, no podemos usar un acceso menos seguro si la verificación en dos pasos está habilitada.

Pasos para enviar un correo electrónico con archivos adjuntos en Python

Primero, tenemos que crear MIME, luego agregar el remitente, el destinatario, el título del correo y el cuerpo adjunto en el MIME creado. Después de eso, abra el archivo adjunto al correo electrónico en modo binario.

Para los archivos adjuntos, agregue un encabezado, abra una sesión SMTP con un número de puerto de trabajo, ‘587’, y salga de la sesión.

Código de ejemplo:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

mail_content = """Hello,
This mail is to inform you about Today's meeting.
"""

sender_address = "sender@gmail.com"
sender_pass = "-------"
receiver_address = "receiver@gmail.com"

message = MIMEMultipart()
message["From"] = sender_address
message["To"] = receiver_address
message["Subject"] = "Info about meeting."
message.attach(MIMEText(mail_content, "plain"))

session = smtplib.SMTP("smtp.gmail.com", 587)
session.starttls()
session.login(sender_address, sender_pass)
text = message.as_string()
session.sendmail(sender_address, receiver_address, text)
session.quit()

print("Mail Sent")

Producción :

Mail Sent

Aquí hay otro ejemplo de cómo enviar un correo electrónico con archivos adjuntos en Python.

Código de ejemplo:

import smtplib

from pathlib import Path
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
import email.utils
from email import encoders
from smtpd import COMMASPACE


def send_mail(
    send_from,
    send_to,
    subject,
    message,
    files=[],
    server="localhost",
    port=587,
    username="",
    password="",
    use_tls=True,
):

    msg = MIMEMultipart()
    msg["From"] = send_from
    import email.utils

    msg["To"] = COMMASPACE.join(send_to)
    msg["Date"] = email.utils.formatdate(localtime=True)
    msg["Subject"] = subject

    msg.attach(MIMEText(message))

    for path in files:
        part = MIMEBase("application", "octet-stream")
        with open(path, "rb") as file:
            part.set_payload(file.read())
        encoders.encode_base64(part)
        part.add_header(
            "Content-Disposition", "attachment; filename={}".format(Path(path).name)
        )
        msg.attach(part)

    smtp = smtplib.SMTP(server, port)
    if use_tls:
        smtp.starttls()
    smtp.login(username, password)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.quit()

Producción :

/Users/apple/PycharmProjects/email/venv/bin/python /Users/apple/PycharmProjects/email/main.py 

Process finished with exit code 0

Recuerde, el primer paso para enviar correos electrónicos en Python es hacer que su cuenta de Google sea menos segura; de lo contrario, generará un error de conexión rechazada. Asegúrese de eliminar la autenticación de dos pasos (2FA) para que funcione.

En segundo lugar, debemos importar el módulo de envío de correo, y se requieren direcciones de correo electrónico y números de puerto de origen y destino válidos para SMTP. Por ejemplo, el número de puerto de Google es 587.

Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn

Artículo relacionado - Python Email