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

El Protocolo simple de transferencia de correo (SMTP) es un protocolo que maneja el envío de correo electrónico y el enrutamiento de 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 correo 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 a partir de esta 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/python

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 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 y 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 de la e -mail en sí, no siempre se utilizan 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 Hotmail o Yahoo! Mail), su proveedor de correo electrónico debe haberle proporcionado los detalles del servidor de correo saliente para que pueda proporcionarlos, de la siguiente manera:

smtplib.SMTP('mail.your-domain.com', 25)

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. Pero Python ofrece la opción de 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 el ejemplo para enviar contenido HTML como correo electrónico. Pruébelo una vez -

#!/usr/bin/python

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 Content-type encabezado a multipart/mixed. Luego, las secciones de texto y 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 denota la sección final del correo electrónico también debe terminar con dos guiones.

Los archivos adjuntos deben codificarse con la pack("m") función para tener codificación base64 antes de la transmisión.

Ejemplo

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

#!/usr/bin/python

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"