Este ejemplo muestra cómo enviar un correo electrónico mediante Direct Mail con Python 2 y el protocolo SMTP. Admite texto sin formato, HTML y varios destinatarios.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una dirección de remitente creada en la consola de Direct Mail (se usa como valor de
username)La contraseña SMTP de dicha dirección de remitente (se usa como valor de
password), creada en la consola de Direct Mail dentro de la configuración de la dirección del remitenteUna o más direcciones de destinatario
(Opcional) Una dirección de respuesta
Envío de correos electrónicos mediante SMTP
El siguiente ejemplo construye un correo electrónico multiparte que incluye cuerpo en texto sin formato y en HTML, y lo envía a través del servidor SMTP de Direct Mail en smtpdm.aliyun.com. Reemplace todos los marcadores '***' por sus valores reales antes de ejecutar el código.
# -*- coding:utf-8 -*-
import smtplib
import email
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.base import MIMEBase
from email.mime.application import MIMEApplication
from email.header import Header
# The sender address. This address is created in the console.
username = '***'
# The sender password. This password is created in the console.
password = '***'
# The custom reply-to address.
replyto = '***'
# The recipient address or a list of recipient addresses. Multiple recipients are supported.
# For the specific number of recipients allowed, see the product specifications.
#receivers = ['address1@example.com', 'address2@example.com']
#rcptto = ','.join(rcptto)
rcptto = '***'
# Build the alternative structure.
msg = MIMEMultipart('alternative')
msg['Subject'] = Header('Custom email subject'.decode('utf-8')).encode()
msg['From'] = '%s <%s>' % (Header('Custom sender nickname'.decode('utf-8')).encode(), username)
msg['To'] = rcptto
msg['Reply-to'] = replyto
msg['Message-id'] = email.utils.make_msgid()
msg['Date'] = email.utils.formatdate()
# Build the text/plain part of the alternative structure.
textplain = MIMEText('Custom plain text content', _subtype='plain', _charset='UTF-8')
msg.attach(textplain)
# Build the text/html part of the alternative structure.
texthtml = MIMEText('Custom HTML content', _subtype='html', _charset='UTF-8')
msg.attach(texthtml)
# Send the email.
try:
client = smtplib.SMTP()
# For Python 2.7 or later, create the client this way to use SSL.
#client = smtplib.SMTP_SSL()
# The standard SMTP port is 25 or 80.
client.connect('smtpdm.aliyun.com', 25)
# Enable DEBUG mode.
client.set_debuglevel(0)
client.login(username, password)
# The sender address and the authentication address must be the same.
# Note: To get the return value of the DATA command, use the
# SMTP.mail, SMTP.rcpt, and SMTP.data methods directly.
client.sendmail(username, rcptto, msg.as_string())
# To send to multiple recipients:
#client.sendmail(username, receivers, msg.as_string())
client.quit()
print 'Email sent successfully!'
except smtplib.SMTPConnectError, e:
print 'Failed to send the email. Connection error: ', e.smtp_code, e.smtp_error
except smtplib.SMTPAuthenticationError, e:
print 'Failed to send the email. Authentication error: ', e.smtp_code, e.smtp_error
except smtplib.SMTPSenderRefused, e:
print 'Failed to send the email. Sender refused: ', e.smtp_code, e.smtp_error
except smtplib.SMTPRecipientsRefused, e:
print 'Failed to send the email. Recipient refused: ', e.smtp_code, e.smtp_error
except smtplib.SMTPDataError, e:
print 'Failed to send the email. Data error: ', e.smtp_code, e.smtp_error
except smtplib.SMTPException, e:
print 'Failed to send the email. ', e.message
except Exception, e:
print 'An exception occurred while sending the email. ', str(e)
Parámetros
|
Parámetro |
Descripción |
|
|
Su dirección de remitente, creada en la consola de Direct Mail. La dirección del remitente y la dirección de autenticación SMTP deben ser iguales. |
|
|
La contraseña SMTP de la dirección del remitente, creada en la consola de Direct Mail. |
|
|
La dirección de respuesta. Las respuestas de los destinatarios se entregan en esta dirección. |
|
|
Una única dirección de destinatario. Para enviar a varios destinatarios, utilice la lista |
Opciones de conexión
El ejemplo usa una conexión sin cifrar en el puerto 25. Para usar SSL, reemplace smtplib.SMTP() por smtplib.SMTP_SSL(). Consulte la documentación de Direct Mail para obtener información sobre el puerto SSL y cualquier requisito adicional de conexión.
Para entornos de producción, utilice SSL. Una conexión sin cifrar en el puerto 25 es adecuada para desarrollo y depuración, pero no cifra sus credenciales ni el contenido del mensaje durante la transmisión.
Manejo de errores
Cada bloque de excepción imprime el código de respuesta SMTP y el mensaje de error, lo cual le permite diagnosticar fallos en la entrega:
|
Excepción |
Causa probable |
|
|
No se puede establecer conexión con |
|
|
|
|
|
Se rechazó la dirección del remitente. Revise la configuración de la dirección del remitente en la consola. |
|
|
Se rechazaron todas las direcciones de destinatario. Compruebe que |
|
|
El servidor devolvió un error relacionado con los datos del mensaje. Revise el cuerpo y los encabezados del correo electrónico. |