Python SMTP enviar correo

SMTP (Simple Mail Transfer Protocol) es el Protocolo Simple de Transferencia de Correo; es un conjunto de reglas para transferir correos desde la dirección de origen hasta la dirección de destino, controla el método de retransmisión de los mensajes.

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

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 un dominio como: example.com, este es un parámetro opcional.
  • port: Si proporcionas el parámetro host, debes especificar el número de puerto que usa el servicio SMTP; generalmente, el puerto SMTP es 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, dirección 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 título, remitente, destinatario, contenido, adjuntos, etc. Al enviar el correo, hay que prestar atención al formato de msg. Este formato es el definido en el protocolo smtp.

Ejemplo

Los siguientes ejemplos requieren que tu máquina tenga instalado un servicio compatible con SMTP, como: sendmail.

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

Ejemplo

#!/usr/bin/python # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # Recibir correo, se puede configurar tu correo QQ u otro correo # Tres parámetros: el primero es el contenido de texto, el segundo plain establece el formato de texto, el tercero utf-8 establece la codificación message = MIMEText('Prueba de envío de correo Python...', 'plain', 'utf-8') message['From'] = Header("Ejemplo", 'utf-8') # Remitente message['To'] = Header("test", 'utf-8') # Destinatario subject = 'Prueba de correo Python SMTP' 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 establecer 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 acceso SMTP, y usamossendmailel método para enviar el mensaje.

Ejecuta el programa anterior, si tu máquina tiene instaladosendmail (programa de agente de transferencia de correo), generará la salida:

$ python test.py 
邮件发送成功

Revisa nuestra bandeja de entrada (generalmente en la carpeta de spam), podrás ver la información del correo:

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

Ejemplo

#!/usr/bin/python # -*- coding: UTF-8 -*- 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, se puede configurar tu correo QQ u otro correo message = MIMEText('Prueba de envío de correo Python...', 'plain', 'utf-8') message['From'] = Header("Ejemplo", 'utf-8') message['To'] = Header("test", 'utf-8') subject = 'Prueba de correo Python SMTP' 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"

Enviar correo en formato HTML con Python

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

Ejemplo

#!/usr/bin/python # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # Recibir correo, se puede configurar 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("Ejemplo", 'utf-8') message['To'] = Header("test", 'utf-8') subject = 'Prueba de correo Python SMTP' 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 tu máquina tiene instalado sendmail, generará la salida:

$ python test.py 
邮件发送成功

Revisa nuestra bandeja de entrada (generalmente en la carpeta de spam), podrás ver la información del correo:


Python enviar correo con adjuntos

Para enviar un correo con adjuntos, primero debes crear una instancia de MIMEMultipart(), luego construir los adjuntos. Si hay varios adjuntos, se pueden construir uno a uno, y finalmente usar smtplib.smtp para enviar.

Ejemplo

#!/usr/bin/python # -*- coding: UTF-8 -*- 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, se puede configurar tu correo QQ u otro correo # Crear una instancia con adjuntos message = MIMEMultipart() message['From'] = Header("Ejemplo", 'utf-8') message['To'] = Header("test", 'utf-8') subject = 'Prueba de correo Python SMTP' 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 Ejemplo...', 'plain', 'utf-8')) # Construir adjunto 1, transferir el archivo test.txt del directorio actual att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8') att1["Content-Type"] = 'application/octet-stream' # Aquí el nombre de archivo se puede escribir arbitrariamente, con cualquier nombre que escribas, ese será el que se muestre en el correo att1["Content-Disposition"] = 'attachment; filename="test.txt"' message.attach(att1) # Construir adjunto 2, transferir el archivo ejemplo.txt del 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"
$ python test.py 
邮件发送成功

Revisa nuestra bandeja de entrada (generalmente en la carpeta de spam), podrás ver la información del correo:


Añadir imágenes en texto HTML

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

Ejemplo

#!/usr/bin/python # -*- coding: UTF-8 -*- 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, se puede configurar tu correo QQ u otro correo msgRoot = MIMEMultipart('related') msgRoot['From'] = Header("Ejemplo", 'utf-8') msgRoot['To'] = Header("test", 'utf-8') subject = 'Prueba de correo Python SMTP' 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 Ejemplo</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, hacer referencia 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"
$ python test.py 
邮件发送成功

Revisa nuestra bandeja de entrada (si está en la carpeta de spam, puede que necesites moverlo a la bandeja de entrada para que se muestre correctamente), podrás ver la información del correo:


Enviar usando un servicio SMTP de terceros

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

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

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

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

QQ SMTP

#!/usr/bin/python # -*- coding: UTF-8 -*- 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, aquí 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 correo 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 correo del destinatario y a la cuenta de correo del destinatario msg['Subject']="Prueba de envío de correo de Ejemplo" # El asunto del correo, también se puede llamar el título server=smtplib.SMTP_SSL("smtp.qq.com", 465) # El servidor SMTP en el 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 del correo 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 declaraciones en 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("Fallo al enviar el correo")
$ python test.py 
邮件发送成功

Después de enviarlo con éxito, inicia sesión en el correo del destinatario para verlo:

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

Otras extensiones