Python 3: envío de correo electrónico mediante SMTP

El Protocolo simple de transferencia de correo (SMTP) es un protocolo que gestiona el envío de un correo electrónico y el enrutamiento del correo electrónico entre servidores de correo.

Python proporciona smtplib módulo, que define un objeto de sesión de cliente SMTP que se puede utilizar para enviar correos a cualquier máquina de Internet con un demonio de escucha SMTP o ESMTP.

Aquí hay una sintaxis simple para crear un objeto SMTP, que luego se puede usar para enviar un correo electrónico:

import smtplib

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

Aquí está el detalle de los parámetros:

  • host- Este es el host que ejecuta su servidor SMTP. Puede especificar la dirección IP del host o un nombre de dominio como tutorialspoint.com. Este es un argumento opcional.

  • port- Si proporciona un argumento de host , debe especificar un puerto, donde el servidor SMTP está escuchando. Por lo general, este puerto sería 25.

  • local_hostname- Si su servidor SMTP se está ejecutando en su máquina local, puede especificar solo localhost la opción.

Un objeto SMTP tiene un método de instancia llamado sendmail, que normalmente se utiliza para enviar un mensaje por correo. Se necesitan tres parámetros:

  • El remitente : una cadena con la dirección del remitente.

  • Los receptores : una lista de cadenas, una para cada destinatario.

  • El mensaje : un mensaje como una cadena con el formato especificado en las distintas RFC.

Ejemplo

A continuación, se muestra una forma sencilla de enviar un correo electrónico mediante el script Python. Pruébelo una vez -

#!/usr/bin/python3

import smtplib

sender = '[email protected]'
receivers = ['[email protected]']

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: SMTP e-mail test

This is a test e-mail message.
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

Aquí, ha colocado un correo electrónico básico en el mensaje, utilizando una comilla triple, teniendo cuidado de formatear los encabezados correctamente. Un correo electrónico requiere unFrom, Toy un Subject encabezado, separado del cuerpo del correo electrónico con una línea en blanco.

Para enviar el correo, use smtpObj para conectarse al servidor SMTP en la máquina local. Luego, use el método sendmail junto con el mensaje, la dirección de remitente y la dirección de destino como parámetros (aunque las direcciones de origen y destino están dentro del correo electrónico, no siempre se usan para enrutar el correo).

Si no está ejecutando un servidor SMTP en su máquina local, puede usar el cliente smtplib para comunicarse con un servidor SMTP remoto. A menos que esté utilizando un servicio de correo web (como gmail o Yahoo! Mail), su proveedor de correo electrónico debe haberle proporcionado los detalles del servidor de correo saliente que puede proporcionar, de la siguiente manera:

mail = smtplib.SMTP('smtp.gmail.com', 587)

Enviar un correo electrónico HTML usando Python

Cuando envía un mensaje de texto utilizando Python, todo el contenido se trata como texto simple. Incluso si incluye etiquetas HTML en un mensaje de texto, se muestra como texto simple y las etiquetas HTML no se formatearán de acuerdo con la sintaxis HTML. Sin embargo, Python ofrece una opción para enviar un mensaje HTML como mensaje HTML real.

Al enviar un mensaje de correo electrónico, puede especificar una versión de Mime, el tipo de contenido y el juego de caracteres para enviar un correo electrónico HTML.

Ejemplo

A continuación, se muestra un ejemplo para enviar el contenido HTML como un correo electrónico. Pruébelo una vez -

#!/usr/bin/python3

import smtplib

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test

This is an e-mail message to be sent in HTML format

<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

Envío de archivos adjuntos como correo electrónico

Para enviar un correo electrónico con contenido mixto, es necesario configurar el Content-type encabezado a multipart/mixed. Luego, el texto y las secciones de adjuntos se pueden especificar dentroboundaries.

Un límite se inicia con dos guiones seguidos de un número único, que no puede aparecer en la parte del mensaje del correo electrónico. Un límite final que indique la sección final del correo electrónico también debe terminar con dos guiones.

Los archivos adjuntos deben estar codificados con la pack("m") función para tener codificación base 64 antes de la transmisión.

Ejemplo

A continuación se muestra un ejemplo, que envía un archivo /tmp/test.txtcomo un archivo adjunto. Pruébelo una vez -

#!/usr/bin/python3

import smtplib
import base64

filename = "/tmp/test.txt"

# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)  # base64

sender = '[email protected]'
reciever = '[email protected]'

marker = "AUNIQUEMARKER"

body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)

# Define the message action
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit

%s
--%s
""" % (body,marker)

# Define the attachment section
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s

%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, reciever, message)
   print "Successfully sent email"
except Exception:
   print ("Error: unable to send email")