Envío de Email en Python con SMTP: Guía Rápida y Fácil
Simple Mail Transfer Protocol (SMTP) es un protocolo que maneja el envío y enrutamiento de correo electrónico entre servidores de correo.
Python proporciona el módulo smtplib, que define un objeto de sesión cliente SMTP para enviar correo a cualquier máquina de Internet con un demonio listener SMTP o ESMTP.
Crear Objeto SMTP
Sintaxis simple:
import smtplib smtpObj = smtplib.SMTP([host[, port[, local_hostname]]])
Parámetros:
- host: Host que ejecuta tu servidor SMTP (IP o dominio como tutorialspoint.com). Opcional.
- port: Puerto donde escucha el servidor SMTP (usualmente 25). Requerido si especificas host.
- local_hostname: Si el servidor SMTP corre en tu máquina local, usa localhost.
El objeto SMTP tiene el método sendmail con tres parámetros:
- sender: Cadena con dirección del remitente.
- receivers: Lista de cadenas, una por destinatario.
- message: Mensaje como cadena formateado según RFCs.
Ejemplo Básico
#!/usr/bin/python import smtplib sender = 'from@fromdomain.com' receivers = ['to@todomain.com'] message = """From: From PersonTo: To Person Subject: SMTP e-mail test This is a test e-mail message. """ try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message) print("Successfully sent email") except smtplib.SMTPException: print("Error: unable to send email")
El email requiere cabeceras From, To y Subject, separadas del cuerpo por una línea en blanco.
Si no tienes servidor SMTP local, usa un servidor remoto:
smtplib.SMTP('mail.tu-dominio.com', 25)
Envío de Email HTML
Por defecto, Python trata todo como texto plano. Para enviar HTML real, especifica versión MIME, tipo de contenido y juego de caracteres.
Ejemplo
#!/usr/bin/python import smtplib message = """From: From PersonTo: To Person MIME-Version: 1.0 Content-type: text/html Subject: SMTP HTML e-mail test This is an e-mail message to be sent in HTML format This is HTML message. This is headline.
""" try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message) print("Successfully sent email") except smtplib.SMTPException: print("Error: unable to send email")
Envío de Adjuntos
Para email con contenido mixto, establece cabecera Content-type a multipart/mixed. Las secciones de texto y adjunto se especifican dentro de límites (boundaries).
Un límite inicia con dos guiones seguidos de un número único que no aparezca en el mensaje. El límite final debe terminar con dos guiones.
Los archivos adjuntos deben codificarse con base64 antes de la transmisión.
Ejemplo: Adjuntar Archivo
#!/usr/bin/python import smtplib import base64 filename = "/tmp/test.txt" # Leer y codificar en base64 fo = open(filename, "rb") filecontent = fo.read() encodedcontent = base64.b64encode(filecontent) sender = 'webmaster@tutorialpoint.com' receiver = 'amrood.admin@gmail.com' marker = "AUNIQUEMARKER" body = "This is a test email to send an attachment." # Cabeceras principales part1 = """From: From PersonTo: To Person Subject: Sending Attachment MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=%s --%s """ % (marker, marker) # Parte del mensaje part2 = """Content-Type: text/plain Content-Transfer-Encoding: 8bit %s --%s """ % (body, marker) # Sección del adjunto part3 = """Content-Type: multipart/mixed; name="%s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=%s %s --%s-- """ % (filename, filename, encodedcontent, marker) message = part1 + part2 + part3 try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receiver, message) print("Successfully sent email") except Exception: print("Error: unable to send email")
Nota: En Python 3, base64.b64encode() retorna bytes; decodifica a string con .decode() si es necesario.
python
- Sensor infrarrojo TMP006 con Raspberry Pi: librería Python y guía de configuración
- Construya un sensor de temperatura remoto con Raspberry Pi y Python – Guía paso a paso
- Dominando tipos de datos en Python: Guía práctica
- Dominando operadores en Python: Guía completa
- Dominando la sentencia pass en Python: Guía práctica
- Dominando argumentos de funciones en Python: Posicionales, por palabra clave y por defecto
- Dominando Diccionarios en Python: Creación, Manipulación y Técnicas Avanzadas
- Dominando el Manejo de Excepciones en Python: try, except, else y finally Explicados
- Calculando Promedios en Python: Guía Práctica con Múltiples Métodos
- Intercambie dos variables Python sin variable temporal: fácil y limpio
- Cómo enviar correos electrónicos en Java: Guía paso a paso