Python

Cómo enviar correos desde Python utilizando Brevo: Automatiza tus notificaciones con scripts eficientes

En un artículo anterior vimos cómo enviar correos desde PowerShell utilizando Brevo, una plataforma de comunicación que permite enviar correos electrónicos, SMS y mensajes de WhatsApp desde aplicaciones y scripts. Esta solución es especialmente útil para automatizar notificaciones en procesos automáticos, logs y tareas de mantenimiento.

En este tutorial abordaremos el mismo objetivo, pero utilizando Python, uno de los lenguajes más populares en el ámbito del scripting, la automatización y el desarrollo backend. Aprenderás cómo enviar correos electrónicos desde tus scripts de Python utilizando el servidor SMTP de Brevo, lo que te permitirá implementar notificaciones automáticas en casos como:

  • Procesamiento de datos o flujos ETL.
  • Tareas programadas (cron jobs).
  • Alertas sobre el estado de servidores o servicios.
  • Resultados de pruebas automatizadas o despliegues.

Al finalizar, contarás con un script funcional que podrás integrar fácilmente en tus proyectos, independientemente del sistema operativo o entorno de ejecución.

¿Por qué enviar correos desde Python?

Aunque PowerShell es una excelente herramienta en entornos Windows, Python es multiplataforma y se utiliza ampliamente en sistemas Linux, macOS y entornos en la nube. Automatizar el envío de correos desde Python ofrece muchas ventajas:

  • Funciona en prácticamente cualquier sistema operativo.
  • Existen múltiples bibliotecas que facilitan el envío de correos (como smtplib, email y ssl).
  • Es ideal para desarrolladores que ya usan Python como parte de sus flujos de trabajo.
  • Permite gran flexibilidad en el contenido del mensaje: adjuntos, formato HTML, procesamiento de datos antes del envío, etc.

¿Qué es Brevo y cómo registrarse?

Para quienes no la conocen, Brevo (anteriormente Sendinblue) es una plataforma de comunicación todo en uno que permite enviar correos transaccionales y campañas de marketing, así como mensajes SMS y de WhatsApp, mediante API o SMTP.

Entre sus ventajas más destacadas:

  • Plan gratuito que permite enviar hasta 300 correos electrónicos diarios.
  • Interfaz web intuitiva y fácil de usar.
  • Compatibilidad con SMTP y API RESTful.
  • Alta tasa de entregabilidad, lo que garantiza que tus correos lleguen a destino.
Sitio web de Brevo, una plataforma todo en uno para marketing por correo electrónico, SMS y automatización de comunicaciones.

Cómo crear una cuenta en Brevo

Si aún no tienes cuenta, el proceso es rápido y gratuito. Estos son los pasos:

  1. Visita https://www.brevo.com
  2. Regístrate con tu correo electrónico y completa los datos básicos que solicita la plataforma.
  3. Confirma tu cuenta haciendo clic en el enlace que recibirás por correo.
  4. Ingresa al panel de control y accede a la sección SMTP & API.
  5. Si aún no lo hiciste, genera una contraseña SMTP (es distinta de la contraseña de acceso).
  6. Copia los siguientes datos, que necesitarás más adelante en tu script de Python:
    • Servidor SMTP: smtp-relay.brevo.com
    • Puerto: 587
    • Usuario SMTP: tu dirección de correo registrada
    • Contraseña SMTP: la que generaste en el paso anterior

Claro, aquí tienes una versión mejorada de tu texto con una redacción más fluida, natural y profesional. He hecho correcciones de estilo, ortografía, coherencia gramatical y algunas sugerencias para mejorar la comprensión y el ritmo de lectura:

Cómo enviar correos desde Python con Brevo

En esta sección veremos paso a paso cómo escribir un script en Python para enviar correos electrónicos utilizando Brevo. Lo haremos usando únicamente la biblioteca estándar de Python (smtplib y email), por lo que no necesitarás instalar ningún paquete adicional ni depender de librerías externas.

Este enfoque es ideal si buscas una solución simple, portátil y fácil de integrar en scripts.

El script paso a paso

Primero, importa los módulos necesarios:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import argparse
import os

Estos módulos cumplen son necesarios para realizar las siguientes funciones:

  • smtplib: se encarga de conectar con el servidor SMTP y enviar el correo.
  • email.mime: permite construir mensajes con cuerpo de texto, HTML y adjuntos.
  • argparse: sirve para recibir la ruta al archivo de log como argumento desde la línea de comandos.
  • os: permite comprobar si el archivo existe antes de intentar leerlo.

Recibir el archivo como parámetro

Agrega este bloque para que el script reciba como parámetro la ruta a un archivo que se desea enviar, por ejemplo, un archivo de log:

parser = argparse.ArgumentParser(description="Envía un log por correo usando Brevo")
parser.add_argument("logfile", help="Ruta al archivo de log")
args = parser.parse_args()

Configuración del servidor SMTP

A continuación, define los parámetros necesarios para conectarse al servidor de Brevo y enviar el correo. Recuerda sustituir los datos por los de tu cuenta real.

# Configuración SMTP
smtp_server = "smtp-relay.brevo.com"
smtp_port = 587
smtp_user = "tu_usuario@ejemplo.com"
smtp_password = "tu_contraseña_smtp"

from_email = "tu_usuario@ejemplo.com"
to_email = "destinatario@ejemplo.com"
subject = "Informe automático de log"

Leer el contenido del archivo

En este ejemplo, incluiremos en el correo solo las últimas 30 líneas del archivo, lo que es útil para evitar saturar el mensaje si el archivo es muy largo.

# Leer el log (últimas 30 líneas)
if os.path.isfile(args.logfile):
    with open(args.logfile, "r", encoding="utf-8") as file:
        lines = file.readlines()
        body_text = ''.join(lines[-30:])
else:
    body_text = f"No se encontró el archivo {args.logfile}"

Construir el mensaje del correo

Ahora construimos el mensaje y le agregamos el cuerpo como texto plano. Si más adelante quieres enviar contenido en HTML, simplemente cambia "plain" por "html":

# Construcción del mensaje
msg = MIMEMultipart()
msg["From"] = from_email
msg["To"] = to_email
msg["Subject"] = subject

body = MIMEText(body_text, "plain", "utf-8")
msg.attach(body)

Enviar el correo

Finalmente, el correo se envía mediante una conexión SMTP segura usando TLS. El bloque try/except permite capturar errores comunes, como problemas de red o credenciales incorrectas.

# Enviar correo
try:
    with smtplib.SMTP(smtp_server, smtp_port) as server:
        server.starttls()  # Activa TLS para cifrar la conexión
        server.login(smtp_user, smtp_password)
        server.sendmail(from_email, to_email, msg.as_string())
    print("Correo enviado correctamente.")
except Exception as e:
    print(f"Error al enviar el correo: {e}")

Cómo usar el script

Guarda el código anterior en un archivo llamado enviar_log.py y ejecútalo desde la terminal así:

Correo recibido exitosamente en el cliente de correo, enviado automáticamente desde un script de Python usando Brevo.
python enviar_log.py /ruta/al/log.txt

Cómo adjuntar el archivo completo al correo

Si prefieres enviar el archivo completo0 como archivo adjunto, puedes hacerlo fácilmente con una pequeña modificación en el script.

En primer lugar, agrega esta línea al principio del archivo para importar MIMEApplication

from email.mime.application import MIMEApplication

Después de agregar el cuerpo del correo (msg.attach(body)), incluye el siguiente bloque:

if os.path.isfile(args.logfile):
    with open(args.logfile, "rb") as file:
        part = MIMEApplication(file.read(), Name=os.path.basename(args.logfile))
        part['Content-Disposition'] = f'attachment; filename="{os.path.basename(args.logfile)}"'
        msg.attach(part)

Esto enviará el archivo completo como adjunto. Puedes mantener un resumen en el cuerpo del correo o simplemente escribir un mensaje como:

body = MIMEText("Se adjunta el archivo de log solicitado.", "plain", "utf-8")

Cómo añadir múltiples destinatarios

Para enviar un correo a varios destinatarios, puedes hacerlo incluyendo todos los correos en una lista:

to_emails = ["user1@ejemplo.com", "user2@ejemplo.com"]
msg["To"] = ", ".join(to_emails)
server.sendmail(from_email, to_emails, msg.as_string())

Buenas prácticas y recomendaciones

Ten en cuenta las siguientes sugerencias para que tu solución sea más segura, robusta y mantenible:

  • Evita contraseñas en texto plano. Usa variables de entorno o carga las credenciales desde un archivo .env con python-dotenv.
  • Adjunta el archvio completo si es muy extenso, en lugar de saturar el cuerpo del mensaje.
  • Valida el contenido del archivo antes de enviarlo: asegúrate de que existe y contiene información útil.
  • Usa HTML si necesitas un formato más visual (tablas, colores, enlaces).
  • Controla el límite diario de envíos. El plan gratuito de Brevo permite hasta 300 correos al día, suficiente para la mayoría de tareas programadas o notificaciones de mantenimiento.

Conclusiones

Enviar correos desde Python utilizando Brevo es una solución práctica, potente y fácil de implementar. Gracias al soporte del protocolo SMTP y al uso de la biblioteca estándar, puedes automatizar el envío de notificaciones y alertas en casi cualquier entorno, sin necesidad de instalar librerías adicionales.

Esta solución es válida tanto para Windows como para Linux, y se adapta perfectamente a tareas programadas, scripts de mantenimiento o sistemas de monitoreo. Además, si ya has implementado algo similar en PowerShell, este enfoque en Python te permitirá extender la funcionalidad a entornos donde Python sea el lenguaje predominante.

¿Quieres ir más allá? Algunas ideas para escalar esta solución:

  • Programarlo con cron o el Programador de tareas de Windows.
  • Integrarlo en pipelines de CI/CD para enviar resultados de pruebas o despliegues.
  • Convertirlo en una microservicio usando FastAPI, lo que te permitirá enviar correos desde cualquier aplicación, servicio o interfaz web, con validación automática y alto rendimiento.

En definitiva, combinar Python con Brevo es una forma ligera, segura y multiplataforma de mantenerte informado sobre procesos críticos de forma automatizada.

Apéndice: Código completo para enviar correos desde Python con Brevo

Este código puede ser fácilmente adaptado para usarse dentro de cron jobs, scripts de monitoreo o pipelines de automatización.

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import argparse
import os

# Argumentos desde línea de comandos
parser = argparse.ArgumentParser(description="Envía un log por correo usando Brevo")
parser.add_argument("logfile", help="Ruta al archivo de log")
args = parser.parse_args()

# Configuración SMTP
smtp_server = "smtp-relay.brevo.com"
smtp_port = 587
smtp_user = "tu_usuario@ejemplo.com"       # Cambia por tu usuario SMTP de Brevo
smtp_password = "tu_contraseña_smtp"       # Cambia por tu contraseña SMTP

from_email = "tu_usuario@ejemplo.com"
to_email = "destinatario@ejemplo.com"
subject = "Informe automático de log"

# Leer el log (últimas 30 líneas)
if os.path.isfile(args.logfile):
    with open(args.logfile, "r", encoding="utf-8") as file:
        lines = file.readlines()
        body_text = ''.join(lines[-30:])
else:
    body_text = f"No se encontró el archivo {args.logfile}"

# Construcción del mensaje
msg = MIMEMultipart()
msg["From"] = from_email
msg["To"] = to_email
msg["Subject"] = subject

body = MIMEText(body_text, "plain", "utf-8")
msg.attach(body)

# Enviar correo
try:
    with smtplib.SMTP(smtp_server, smtp_port) as server:
        server.starttls()
        server.login(smtp_user, smtp_password)
        server.sendmail(from_email, to_email, msg.as_string())
    print("Correo enviado correctamente.")
except Exception as e:
    print(f"Error al enviar el correo: {e}")

Nota: La imagen de este artículo fue generada utilizando un modelo de inteligencia artificial.

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

Cómo crear un Data Lake en Azure paso a paso

El volumen de datos que las organizaciones generan y deben manejar crece día a día:…

1 día ago

¿Por qué el azar no es tan aleatorio como parece?

Cuando escuchamos la palabra “azar”, pensamos en lo impredecible: una moneda que gira en el…

3 días ago

Detectan vulnerabilidad crítica en MLflow que permite ejecución remota de código

Una nueva vulnerabilidad crítica ha sido detectada en MLflow, la popular plataforma de código abierto…

4 días ago

Curiosidad: ¿Por qué los datos “raros” son tan valiosos?

En estadística, los valores atípicos —también llamados outliers— son esos datos que se alejan “demasiado”…

1 semana ago

Cómo generar contraseñas seguras con Python (y entender su nivel de seguridad)

Vivimos en un mundo cada vez más digital, donde gestionamos decenas (o incluso cientos) de…

1 semana ago

Cómo ejecutar JavaScript desde Python: Guía práctica con js2py

Aunque Python y JavaScript son lenguajes muy distintos en su propósito y ecosistema, no es…

2 semanas ago

This website uses cookies.