Python3 SMTP enviar correo

SMTP (Simple Mail Transfer Protocol), es decir, Protocolo Simple de Transferencia de Correo, es un conjunto de reglas para transferir correo desde una dirección de origen a una dirección de destino, que controla el modo de reenvío de los mensajes.

El módulo smtplib de Python proporciona una forma muy conveniente de enviar correos electrónicos. Encapsula de manera simple el protocolo SMTP.

La sintaxis para crear un objeto SMTP en Python es la siguiente:

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

Descripción de parámetros:

  • host: Host del servidor SMTP. Puedes especificar la dirección IP del host o el nombre de dominio, como: example.com. Este es un parámetro opcional.
  • port: Si proporcionas el parámetro host, debes especificar el número de puerto utilizado por el servicio SMTP. Generalmente, el puerto SMTP es el 25.
  • local_hostname: Si SMTP está en tu máquina local, solo necesitas especificar la dirección del servidor como localhost.

El objeto SMTP de Python usa el método sendmail para enviar correos. La sintaxis es la siguiente:

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]

Descripción de parámetros:

  • from_addr: Dirección del remitente del correo.
  • to_addrs: Lista de cadenas, direcciones de envío del correo.
  • msg: Mensaje a enviar

Aquí hay que tener en cuenta el tercer parámetro: msg es una cadena que representa el correo. Sabemos que un correo generalmente se compone de asunto, remitente, destinatario, contenido, adjuntos, etc. Al enviar el correo, se debe prestar atención al formato de msg. Este formato es el definido en el protocolo SMTP.

Ejemplo

El siguiente es un ejemplo sencillo de envío de correos con Python:

Ejemplo

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # Recibir correo, puede configurarse con tu correo QQ u otro correo # Tres parámetros: el primero es el contenido del texto, el segundo (plain) establece el formato del texto, el tercero (utf-8) establece la codificación message = MIMEText('Prueba de envío de correo Python...', 'plain', 'utf-8') message['From'] = Header("Tutorial para novatos", 'utf-8') # Remitente message['To'] = Header("Prueba", 'utf-8') # Destinatario subject = 'Prueba de correo SMTP de Python' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message.as_string()) print ("Correo enviado con éxito") except smtplib.SMTPException: print ("Error: no se pudo enviar el correo")

Usamos tres comillas para configurar la información del correo. Un correo estándar necesita tres encabezados:From, To, ySubject, cada información se separa directamente con una línea en blanco.

Instanciamos el objeto SMTP del módulo smtplibsmtpObjpara conectarnos al servidor SMTP, y usamossendmailmétodo para enviar el mensaje.

Ejecuta el programa anterior, si tienes sendmail instalado en tu máquina, se mostrará:

$ python3 test.py 
邮件发送成功

Revisa tu bandeja de entrada (generalmente en la bandeja de spam), podrás ver el mensaje:

Si no tenemos acceso a sendmail en nuestra máquina, también podemos usar el acceso SMTP de otros proveedores de servicios (QQ, NetEase, Google, etc.).

Ejemplo

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.header import Header # Servicio SMTP de terceros mail_host="smtp.XXX.com" # Configurar servidor mail_user="XXXX" # Nombre de usuario mail_pass="XXXXXX" # Contraseña sender = '[email protected]' receivers = ['[email protected]'] # Recibir correo, puede configurarse con tu correo QQ u otro correo message = MIMEText('Prueba de envío de correo Python...', 'plain', 'utf-8') message['From'] = Header("Tutorial para novatos", 'utf-8') message['To'] = Header("Prueba", 'utf-8') subject = 'Prueba de correo SMTP de Python' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 es el número de puerto SMTP smtpObj.login(mail_user,mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) print ("Correo enviado con éxito") except smtplib.SMTPException: print ("Error: no se pudo enviar el correo")

Usar Python para enviar correos en formato HTML

La diferencia entre enviar correos en formato HTML con Python y enviar correos de texto plano es que se establece _subtype en MIMEText como html. El código específico es el siguiente:

Ejemplo

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # Recibir correo, puede configurarse con tu correo QQ u otro correo mail_msg = """<p>Prueba de envío de correo Python...</p> <p><a href="http://www.example.com">Este es un enlace</a></p>""" message = MIMEText(mail_msg, 'html', 'utf-8') message['From'] = Header("Tutorial para novatos", 'utf-8') message['To'] = Header("Prueba", 'utf-8') subject = 'Prueba de correo SMTP de Python' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message.as_string()) print ("Correo enviado con éxito") except smtplib.SMTPException: print ("Error: no se pudo enviar el correo")

Ejecuta el programa anterior, si tienes sendmail instalado en tu máquina, se mostrará:

$ python3 test.py 
邮件发送成功

Revisa tu bandeja de entrada (generalmente en la bandeja de spam), podrás ver el mensaje:


Python enviar correos con archivos adjuntos

Para enviar correos con archivos adjuntos, primero se debe crear una instancia de MIMEMultipart(), luego construir los adjuntos. Si hay varios adjuntos, se pueden construir uno tras otro. Finalmente, se envía usando smtplib.smtp.

Ejemplo

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # Recibir correo, puede configurarse con tu correo QQ u otro correo # Crear una instancia con adjuntos message = MIMEMultipart() message['From'] = Header("Tutorial para novatos", 'utf-8') message['To'] = Header("Prueba", 'utf-8') subject = 'Prueba de correo SMTP de Python' message['Subject'] = Header(subject, 'utf-8') # Contenido del cuerpo del correo message.attach(MIMEText('Esta es la prueba de envío de correo Python de Tutorial para novatos...', 'plain', 'utf-8')) # Construir el adjunto 1, enviar el archivo test.txt en el directorio actual att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8') att1["Content-Type"] = 'application/octet-stream' # Aquí filename puede escribirse arbitrariamente, con el nombre que se escriba, ese nombre se mostrará en el correo att1["Content-Disposition"] = 'attachment; filename="test.txt"' message.attach(att1) # Construir el adjunto 2, enviar el archivo ejemplo.txt en el directorio actual att2 = MIMEText(open('ejemplo.txt', 'rb').read(), 'base64', 'utf-8') att2["Content-Type"] = 'application/octet-stream' att2["Content-Disposition"] = 'attachment; filename="ejemplo.txt"' message.attach(att2) try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message.as_string()) print ("Correo enviado con éxito") except smtplib.SMTPException: print ("Error: no se pudo enviar el correo")
$ python3 test.py 
邮件发送成功

Revisa tu bandeja de entrada (generalmente en la bandeja de spam), podrás ver el mensaje:


Agregar imágenes en texto HTML

En el texto HTML del correo, generalmente agregar enlaces externos por parte de los proveedores de correo no es válido. El ejemplo correcto para agregar imágenes es el siguiente:

Ejemplo

#!/usr/bin/python3 import smtplib from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # Recibir correo, puede configurarse con tu correo QQ u otro correo msgRoot = MIMEMultipart('related') msgRoot['From'] = Header("Tutorial para novatos", 'utf-8') msgRoot['To'] = Header("Prueba", 'utf-8') subject = 'Prueba de correo SMTP de Python' msgRoot['Subject'] = Header(subject, 'utf-8') msgAlternative = MIMEMultipart('alternative') msgRoot.attach(msgAlternative) mail_msg = """<p>Prueba de envío de correo Python...</p> <p><a href="http://www.example.com">Enlace de Tutorial para novatos</a></p> <p>Demostración de imagen:</p> <p><img src="cid:image1"></p>""" msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8')) # Especificar la imagen en el directorio actual fp = open('test.png', 'rb') msgImage = MIMEImage(fp.read()) fp.close() # Definir el ID de la imagen, referenciado en el texto HTML msgImage.add_header('Content-ID', '<image1>') msgRoot.attach(msgImage) try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, msgRoot.as_string()) print ("Correo enviado con éxito") except smtplib.SMTPException: print ("Error: no se pudo enviar el correo")
$ python3 test.py 
邮件发送成功

Revisa tu bandeja de entrada (si está en la bandeja de spam, es posible que debas moverlo a la bandeja de entrada para que se muestre correctamente), podrás ver el mensaje:


Enviar usando un servicio SMTP de terceros

Aquí se usa el servicio SMTP de QQ Mail (también puedes usar 163, Gmail, etc.), se requiere la siguiente configuración:

QQ Mail configura la contraseña generando un código de autorización:

Dirección del servidor SMTP de QQ Mail: smtp.qq.com, puerto SSL: 465.

En el siguiente ejemplo debes modificar: correo del remitente (tu correo QQ), contraseña, correo del destinatario (puedes enviártelo a ti mismo).

QQ SMTP

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.utils import formataddr my_sender='[email protected]' # Cuenta de correo del remitente my_pass = 'xxxxxxxxxx' # Contraseña del correo del remitente my_user='[email protected]' # Cuenta de correo del destinatario, en mi caso me lo envío a mí mismo def mail(): ret=True try: msg=MIMEText('Rellenar el contenido del correo','plain','utf-8') msg['From']=formataddr(["FromEjemplo",my_sender]) # Lo que va entre paréntesis corresponde al alias del remitente y a la cuenta de correo del remitente msg['To']=formataddr(["FK",my_user]) # Lo que va entre paréntesis corresponde al alias del destinatario y a la cuenta de correo del destinatario msg['Subject']="Prueba de envío de correo de Tutorial para novatos" # El asunto del correo, también se puede decir el título server=smtplib.SMTP_SSL("smtp.qq.com", 465) # Servidor SMTP del correo del remitente, el puerto es 25 server.login(my_sender, my_pass) # Lo que va entre paréntesis corresponde a la cuenta de correo del remitente y a la contraseña server.sendmail(my_sender,[my_user,],msg.as_string()) # Lo que va entre paréntesis corresponde a la cuenta de correo del remitente, la cuenta de correo del destinatario y el envío del correo server.quit() # Cerrar la conexión except Exception: # Si las sentencias dentro de try no se ejecutan, se ejecutará el siguiente ret=False ret=False return ret ret=mail() if ret: print("Correo enviado con éxito") else: print("Error al enviar el correo")
$ python test.py 
邮件发送成功

Después de un envío exitoso, inicia sesión en el correo del destinatario para verlo:

Para más contenido, consulta:https://docs.python.org/3/library/email-examples.html。

Otras extensiones