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
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = '[email protected]'
receivers = ['[email protected]']
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('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
import smtplib
from email.mime.text import MIMEText
from email.header import Header
mail_host="smtp.XXX.com"
mail_user="XXXX"
mail_pass="XXXXXX"
sender = '[email protected]'
receivers = ['[email protected]']
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)
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
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = '[email protected]'
receivers = ['[email protected]']
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
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]']
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')
message.attach(MIMEText('Esta es la prueba de envío de correo Python de Tutorial para novatos...', 'plain', 'utf-8'))
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att1)
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
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]']
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'))
fp = open('test.png', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
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
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
my_sender='[email protected]'
my_pass = 'xxxxxxxxxx'
my_user='[email protected]'
def mail():
ret=True
try:
msg=MIMEText('Rellenar el contenido del correo','plain','utf-8')
msg['From']=formataddr(["FromEjemplo",my_sender])
msg['To']=formataddr(["FK",my_user])
msg['Subject']="Prueba de envío de correo de Tutorial para novatos"
server=smtplib.SMTP_SSL("smtp.qq.com", 465)
server.login(my_sender, my_pass)
server.sendmail(my_sender,[my_user,],msg.as_string())
server.quit()
except Exception:
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