Google+ Seguidores

domingo, 7 de diciembre de 2014

Enviar un correo con Python (smtplib)

    4

Enviar correo electrónico en Python
Enviar correo electrónico en Python
La idea de esta entrada es aprender a enviar un correo electrónico (Gmail) utilizando el módulo smtplib en Python. Con este script por ejemplo, podremos automatizar el envío de correos en aplicaciones más grandes.

Python incluye varios módulos para trabajar con servidores de correo electrónico. En nuestro ejemplo, utilizaremos el módulo smtplib que viene integrado en python, y nos servirá para mandar correos electrónicos a Gmail.
A continuación veremos 3 ejemplos de envío de correos en python a Gmail.

Para utilizarlo en Hotmail:

Servidor SMTP: smtp.live.com
Puerto SMTP: 587
Usuario: Tu Windows Live ID (correo@hotmail.com)
Contraseña: la del correo

Servidor POP: pop3.live.com
Puerto POP: 995
POP SSL: Si
Usuario: correo@hotmail.com
Contraseña: la del correo

Enviar correo con python y gmail (Primer Ejemplo)


Código:

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Enviar correo Gmail con Python
# www.pythondiario.com

import smtplib

fromaddr = 'tucorreo@gmail.com'
toaddrs  = 'destino@gmail.com'
msg = 'Correo enviado utilizano Python + smtplib en www.pythondiario.com'


# Datos
username = 'tucorreo@gmail.com'
password = 'contraseña'

# Enviando el correo
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

No hace falta explicar mucho por su sencillez. Importamos el módulo smtplib, creamos unas variables con nuestro correo, el correo del destinatario y el mensaje a enviar. En la parte de #Datos, hacemos el login de nuestro correo. Por último, hacemos la conexión al servidor en el puerto 587 y mandamos el correo.

¿En que lo podemos implementar?

Supongamos que tenemos un programa que controla temperaturas y queremos recibir un correo alertando cada ves que la temperatura sea mayor a 70°. Podemos implementarlo de la siguiente manera:

...
if temperatura > 70:
----# Aquí iría nuestro script para enviar correo informando el inconveniente

Otro ejemplo para utilizarlo:

...
if tarea.completOK():
----# Aquí iría nuestro script informando que la tarea fue realizada, y los detalles que correspondan

Enviar correo con Python y Gmail (Segundo ejemplo)


Código:

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Enviar correo Gmail con Python
# www.pythondiario.com

import smtplib, socket, sys, getpass

def main():

 # Conexion con el servidor 
 try:
  smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
  smtpserver.ehlo()
  smtpserver.starttls()
  smtpserver.ehlo()
  print "Conexion exitosa con Gmail"
  print "Concectado a Gmail"
  # Datos 
  try:
   gmail_user = str(raw_input("Escriba su correo: ")).lower().strip()
   gmail_pwd = getpass.getpass("Escriba su password: ").strip()
   smtpserver.login(gmail_user, gmail_pwd)
  except smtplib.SMTPException:
   print ""
   print "Autenticacion incorrecta" + "\n"
   smtpserver.close()
   getpass.getpass("Presione ENTER para continuar...")
   sys.exit(1)


 except (socket.gaierror, socket.error, socket.herror, smtplib.SMTPException), e:
  print "Fallo en la conexion con Gmail"
  print getpass.getpass("Presione ENTER para continuar...")
  sys.exit(1)


 while True:
  to = str(raw_input("Enviar correo a: ")).lower().strip()
  if to != "":
   break
  else:
   print "El correo es necesario!!!"

 sub = str(raw_input("Asunto: ")).strip()
 bodymsg = str(raw_input("Mensaje: "))
 print ""
 header = "Para: " + to +"\n" + "De: " + gmail_user + "\n" + "Asunto: " + sub + "\n"
 print header
 msg = header + "\n" + bodymsg + "\n\n"
 print msg

 try:
  smtpserver.sendmail(gmail_user, to, msg)
 except smtplib.SMTPException:
  print "El correo no pudo ser enviado" + "\n"
  smtpserver.close()
  getpass.getpass("Presione ENTER para continuar...")
  sys.exit(1)

 print "El correo se envio correctamente" + "\n"
 smtpserver.close()
 getpass.getpass("Presione ENTER para continuar")
 sys.exit(1)


main()

Algunas especificaciones:
Este ejemplo, más completo, contiene varias excepciones que harán que nuestro script pueda continuar en caso de errores. 
Con el módulo getpass pedimos al usuario la contraseña del correo sin mostrar lo que escribe en consola (por un tema de seguridad).
También utilizamos el módulo socket para crear una Excepción y el módulo sys para salir del programa en caso de algún error. 
El método lower() devuelve la cadena en minúscula, y el método strip() elimina los espacios en blanco a la izquierda y derecha de la cadena.


Enviar un email con python (Tercer ejemplo)


Código:

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Enviar correo Gmail con Python
# www.pythondiario.com 
 
from email.mime.text import MIMEText
from smtplib import SMTP

def main():
 from_address = "micorreo@gmail.com"
 to_address = "correodestinatario@gmail.com"
 message = "Mensaje enviado desde python"
 mime_message = MIMEText(message)
 mime_message["From"] = from_address
 mime_message["To"] = to_address
 mime_message["Subject"] = "Correo de prueba"
 smtp = SMTP("smtp.gmail.com", 587)
 smtp.ehlo()
   smtp.starttls()
   smtp.ehlo()
 smtp.login(from_address, "clave")
 smtp.sendmail(from_address, to_address, mime_message.as_string())
 smtp.quit()
if __name__ == "__main__":
 main()

En este script, a parte de importar el módulo smtplib, también importamos el módulo email que sirve para gestionar mensajes de correo electrónico (incluye MIME). Más información sobre este módulo en la página oficial: https://docs.python.org/2/library/email.mime.html

---------------------------------------------------------------------------------------------------------------------------------------

Espero esta entrada les sea de utilidad. Cualquier duda o sugerencia dejarla al final de la entrada, en los comentarios. Saludos

4 comentarios:
Write comentarios
  1. Creo que en el código has publicado tu contraseña...

    ResponderEliminar
  2. Le agregue esta función a tu agenda y funciona perfecto! Gracias.

    ResponderEliminar
    Respuestas
    1. Buena Martin. La próxima agenda la haré gráfica y va a tener la función de mandar correos también. Saludos y a codear ;-)

      Eliminar
  3. Hola en el ejemplo me manda un error: SyntaxError: Non-ASCII character '\xf3' in file C:\ejemplo\envio.py on line 13, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
    declared; see http://python.org/dev/peps/pep-0263/ for details
    Entre a la pagina y es por la codificacion, pero al inicio del archivo esta declarado # -*- coding: utf-8 -*- gracias

    ResponderEliminar

Tu comentario es importante y nos motiva a seguir escribiendo...

Entradas más recientes

© 2014 Mi diario Python. Designed by Bloggertheme9 | Distributed By Gooyaabi Templates
Powered by Blogger.