No es un bug, es una característica no documentada

martes, 20 de diciembre de 2016

Envío de mails en Python

10:53 Posted by Inazio Claver 4 comments
Ésta será una entrada rápida.

Os pongo en situación. A partir de hoy en el trabajo debemos fichar diariamente a base de enviar un correo electrónico cuando empecemos cada jornada, tanto por la mañana como por la tarde. Los mails deberán llevar como cabecera nuestro nombre de usuario, la fecha actual en formato DDMMAA y la letra M o T dependiendo si es por la mañana o por la tarde, y en el cuerpo del mensaje deberá llevar un texto en concreto.

Bien, el caso es que soy un poco perro y, como pretendo quedarme bastante tiempo en esta empresa, no me apetece mucho tener que estar escribiendo todos los días, dos veces al día, el mismo correo. Es una tarea repetitiva que se puede automatizar fácilmente.

Y aprovechando que estoy intentando aprender Python, ¿qué lenguaje mejor para programar ese script que el de la serpiente? Leyendo un poquito vi que enviar mails con Python es tremendamente sencillo, enseguida lo veréis.

El script debía constar de dos partes, una que extrajera la fecha del sistema y la formateara como yo quisiera, y la segunda que creara un mail y lo mandase.

El código completo es el siguiente:
# -*- coding: utf-8 -*-
import smtplib
import time

'''
Calcular la hora
'''
if (time.strftime("%p") == "AM"):
 tipoHora = "M"
else:
 tipoHora = "T"

'''
Crear datos de envío
'''
remitente   = "Inazio <remitente@mail.com>"
destinatario  = "destinatario@mail.com"
asunto    = "xxxxxxxxxx" + time.strftime("%d%m%y") + tipoHora
mensaje   = "Aquí va el contenido de nuestro mensaje"

'''
Preparo el mail y agrego campos
'''
email = """From: %s 
To: %s 
MIME-Version: 1.0 
Content-type: text/html 
Subject: %s 
 
%s
""" % (remitente, destinatario, asunto, mensaje)

try:
 smtp = smtplib.SMTP('smtp.mail.com')
 smtp.login('inazio.claver@mail.com', '*******')
 smtp.sendmail(remitente, destinatario, email)
 smtp.quit()
except Exception as e:
 print(e)
Vamos a verlo paso a paso para comprender bien lo que hace.

¿Qué información necesitamos conocer?

Antes de nada, debemos tener claro qué es lo que necesitamos.
  1. Correo electrónico del remitente
  2. Correo electrónico del destinatario
  3. Dirección del servidor SMTP para envíar el mensaje
  4. Asunto y cuerpo de nuestro mensaje
Sabiendo eso, lo primero que haremos será importar las librerías necesarias, que afortunadamente se incluyen en el paquete por defecto. Son time para trabajar con tiempos, y smtplib para envío de correos electrónicos. Además agregaremos nuestra consabida cabecera de utf-8
# -*- coding: utf-8 -*-
import smtplib
import time
Ahora viene la parte en la que trabajaremos con la fecha y hora.
La hora se captura con la función time.strftime() pudiendo pasarle varios parámetros para imprimirla en cadena de texto como deseemos. A saber:

Información extraída de Python Diario.
Por lo tanto, como quiero construir una cadena que sea DDMMAA y si es por la tarde o por el día, primero averiguaré si es AM o PM y luego concatenaré el resultado en un String.
if (time.strftime("%p") == "AM"):
 tipoHora = "M"
else:
 tipoHora = "T"

'''
El asunto debe ser mi nombre de usuario, más la fecha y si es mañana o tarde. Ej: xxxxxxxxxxxx201216M
'''
asunto    = "xxxxxxxxxx" + time.strftime("%d%m%y") + tipoHora
Solo nos queda crear la información que insertaremos en el mail. Lo podemos hacer de la siguiente manera, a través de la sustitución de parámetros indicados en una cadena de texto.
email = """From: %s 
To: %s 
MIME-Version: 1.0 
Content-type: text/html 
Subject: %s
 
%s
""" % (remitente, destinatario, asunto, mensaje)
Y ahora trabajaremos configurando nuestro servidor, siempre dentro de una sección try / except.
try:
 smtp = smtplib.SMTP('smtp.mail.com')
 smtp.login('ignacio.claver@movicoders.com', 'G62iji3@')
 smtp.sendmail(remitente, destinatario, email)
 smtp.quit()
except Exception as e:
 print(e)
Lo primero es establecer la dirección de nuestro servidor SMTP para posteriormente usar. Después nos loguearemos usando el correo electrónico y la contraseña, y posteriormente usamos la función sendmail pasandole los parámetros de remitente, destinatario y el email a enviar, que establecimos anteriormente.
Nota: Según la configuración del servidor SMTP a veces no es necesario establecer usuario y contraseña.

Con todo eso ya estamos listos para generar el mail. Bastará con lanzar la aplicación desde la consola de Python e ir a revisarlo a nuestro cliente de correo electrónico. Si ha habido algún error se mostrará en la consola desde la que hemos lanzado el programa.


Si a vosotros no os llega a la bandeja de entrada deberíais revisar la sección de SPAM.

4 comentarios:

  1. Para que funcione en Python3 que hay que hacer porque da el siguiente error:
    'ascii' codec can't encode character '\xed' in position 141: ordinal not in range(128)

    Y otra pregunta para mandar un archivo adjunto podría poner un ejemplo.

    Un saludo y gracias por el aporte.

    ResponderEliminar
    Respuestas
    1. Hola!
      El código está escrito en Python3. Lo que te reporta es un problema de cofificación. Asegurate que al inicio de tu código estás indicando que la codificación del programa sea UTF-8.
      Puedes hacer escribiendo en la primera línea este comentario:
      # -*- coding: utf-8 -*-

      Con eso debería solucionarse tu problema.
      Saludos!

      Eliminar
  2. J'ai lu cet article, il est vraiment informatif. Votre façon d'écrire et de clarifier les choses est très impressionnante. Je vous remercie pour un tel article informatif. Campagne Marketing multicanales

    ResponderEliminar