Google+ Seguidores

domingo, 7 de diciembre de 2014

Enviar un correo con Python (smtplib)

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

18 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
  4. Hola tu segundo ejemplo me funciono muy bien excepto por algunos pequeños cambios que tuve que hacer por que estoy en python 3

    ResponderEliminar
    Respuestas
    1. Exelente Irma, Saludos y gracias por visitar el blog!!!

      Eliminar
  5. Un "while true" y un "break" de por medio... Mal

    ResponderEliminar
  6. Excelente!
    Estaba viendo varios blogs en los que en lugar de hacer las cosas sencillas se complican instalando librerias como MIMEText.
    Felicitaciones!

    ResponderEliminar
  7. tu primer ejemplo me funciono bien, me gustaría saber en donde iría el if y como seria el scrip en un complemento.

    ResponderEliminar
    Respuestas
    1. Hola, no entiendo bien tu pregunta. Los otros ejemplos no te funcionaron? que error tienes?
      Saludos

      Eliminar
    2. Hola.
      Tu primer ejemplo me funciono bien, lo que en la descripcion dices que se puede implementar un if para "recibir un correo alertando cada ves que la temperatura sea mayor a 70°". Me gustaria ver el codigo completo, si me estoy explicando? o algun otro medio donde pueda contactarte mas rapido?

      Eliminar
    3. Ahh bien, en realidad era un ejemplo. Imagina que tienes el código de envío de correo en una función “EnviarCorreo” y tienes otra función que por ejemplo está continuamente (ej: cada 5 minutos) comprobando la temperatura del CPU del ordenador, con un if que pregunte:

      if temp > 50:
      ----EnviarCorreo

      Pero quiero que sepas que fue a modo de ejemplo de para que se podría utilizar enviar correo con Python!!!

      Saludos, Diego

      Eliminar
  8. no me sale me sale contraseña no autentificada

    ResponderEliminar
  9. Estos son los datos que deberías cambiar para el primer ejemplo:

    fromaddr = 'tucorreo@gmail.com'
    toaddrs = 'destino@gmail.com'
    username = 'tucorreo@gmail.com'
    password = 'contraseña'

    Saludos y gracias por visitar el blog!!!

    ResponderEliminar
  10. Una consulta como puedo hacer para enviar a varios destinatarios, actualmente los estoy colocando de la siguiente manera:

    to = ("prueba1@gmail.com; prueba2@hotmail.com")

    A la hora de enviar y recibir los correos, solo recibo el del primer destinatario, el otro nunca llega.

    Slds.

    Gracias.

    ResponderEliminar
    Respuestas
    1. Hola Josue, prueba con esto:

      import smtplib

      fromaddr = 'tucorreo@gmail.com'
      toaddrs = ["","","", "", ""]
      asunto = "Asunto del correo"
      msg = """Hola muchachada!!!

      email = """From: %s
      To: %s
      MIME-Version: 1.0
      Content-type: text/html
      Subject: %s

      %s
      """ % (fromaddr, toaddrs, asunto, msg)

      # 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, email)
      server.quit()

      Eliminar
  11. Una pregunta: ¿Como podría enviar el correo con Tkinter?

    ResponderEliminar

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

Entradas más recientes

Powered by Blogger .