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
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("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"
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
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("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)
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
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("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
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("Ejemplo", 'utf-8')
message['To'] = Header("test", 'utf-8')
subject = 'Prueba de correo Python SMTP'
message['Subject'] = Header(subject, 'utf-8')
message.attach(MIMEText('Esta es la prueba de envío de correo Python de Ejemplo...', '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"
$ 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
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("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'))
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"
$ 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
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 Ejemplo"
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("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