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

Índice

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 + "nn"
 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

  1. Anónimo dice:

    Creo que en el código has publicado tu contraseña...

  2. Unknown dice:

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

    1. PythonDiario dice:

      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 😉

  3. Unknown dice:

    Hola en el ejemplo me manda un error: SyntaxError: Non-ASCII character 'xf3' in file C:ejemploenvio.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

  4. Irma J. Dávila Plasencia dice:

    Hola tu segundo ejemplo me funciono muy bien excepto por algunos pequeños cambios que tuve que hacer por que estoy en python 3

    1. PythonDiario dice:

      Exelente Irma, Saludos y gracias por visitar el blog!!!

    2. Tito dice:

      Hola Irma me podrias indicar cuales cambios realizaste por favor, estoy modificando y ya voy por el while que me da error de sintaxis

  5. Anónimo dice:

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

  6. Unknown dice:

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

    1. PythonDiario dice:

      Muchas Gracias Sebas!!!
      Saludos

  7. Anónimo dice:

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

    1. PythonDiario dice:

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

    2. Anónimo dice:

      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?

    3. PythonDiario dice:

      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

  8. Unknown dice:

    no me sale me sale contraseña no autentificada

  9. PythonDiario dice:

    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!!!

  10. Josue Coto dice:

    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.

    1. PythonDiario dice:

      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()

    2. Unknown dice:

      Buenos dias estimado, gracias por el aporte.. me sirvio mucho.. solo tengo una duda al enviar el correo no se envia con el asunto, que podra faltar? espero me puedas ayudar saludos y gracias nuevamente

  11. Demi dice:

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

  12. Anónimo dice:

    Hola muy bueno el tuto pero tengo cierta duda, aqui pones para usarlo por gmail y mi duda seria si quisiera usar otro servidor smtp q no fuera gmail o sea te pongo un ejemplo gmail usa TLS si yo quisiera usarlo con otro SMTP q no usa TLS ni SSL como seria??

    Gracias

    1. Anónimo dice:

      Hola!!
      Yo estoy con el mismo problema, si para enviar correo NO USO gmail, si no una cuenta correo/servidor corporativo del que solo tengo:
      -nombre del servidor SMTP.xxxx.xx
      -puerto (25)
      -el servidor requiere conexion segura SSL
      Como seria??

    2. PythonDiario dice:

      Hola a los 2, gracias por escribir en el blog.
      Por ejemplo para Hotmail es así:
      s = smtplib.SMTP("smtp.live.com",587)

      Yo para la empresa de trabajo utilizo:
      s = smtplib.SMTP("dominiodelaempresa.com", puerto)

      Saludos

  13. Unknown dice:

    Oye, se podría, con este mismo software, enviar imágenes? Gracias

  14. Unknown dice:

    hola, buenas, quisiera saber como puedo enviar un archivo txt, soy nuevo, disculpa la molestia

  15. Anónimo dice:

    Hola,

    Tengo un problema, yo envío un correo a varios destinatarios, hasta ahí perfecto. El problema es que los que lo reciben no pueden ver el resto de destinatarios y lo necesito ya que siempre alguna de estas personas tiene que dar una respuesta al resto.

    He probado con tu primer ejemplo y me pasa igual, los que reciben solo pueden responder al que lo envía.

    Gracias y un saludo.

  16. Blog de prueba dice:

    Hola, he logrado enviar un correo con exito, incluso estoy implementando el ejemplo que pusiste arriba de la temperatura:

    if temperatura > 70:

    Estoy recibiendo los datos de una base de datos que recibe los valores de un sensor de temperatura y esta se actualiza cada 15 seg y me gráfica los datos. Me envía un correo si el valor de la temperatura pasa los 25°C. Mi pregunta es si hay alguna manera de limitar el envió del correo ya que si el valor se mantiene arriba de los 25°C me estará enviando un correo cada 15 seg ya que ese es el tiempo en el que se reciben valores para después graficarlos. Por ejemplo limitar el envió cada 20 minutos si es que la temperatura se mantiene arriba de los 25°C por 2 horas por ejemplo.

    Muchas gracias.

  17. Anónimo dice:

    Si os da un fallo de autentificación debereis modificar en la parte de seguridad de vuestra cuenta de gmail para que no bloquee a las "aplicaciones poco seguras". A mí me ocurría eso y al desbloquearlo, haciendo caso omiso a las advertencias de google, me funciona perfectamente.

  18. Unknown dice:

    Hola, tengo una pregunta bien curiosa
    Al haber realizado un programa de python con el objetivo de correo electrónico y teniendo un Arduino con un programa en la IDE del mismo arduino que por ejemplo usa un sensor de temperatura... cómo sería posible combinar ambos para que el programa de python pueda enviar un correo teniendo conectado al pc el Arduino? O quizá alguna forma de combinar de esa manera para hacer una solución distinta, gracias por lo que aportas con el blog, espero tu respuesta y gracias nuevamente

  19. Unknown dice:

    Hola tengo una pregunta ya tengo configurado todo y funciona para los corro de Gmail, pero los usuarios de hotmail no les llega, los correos vienen de BD, hago el recorrido y el envío pero al toparse con un correo de Hotmail no de envía. El correo que uso es corporativo
    Me podrías ayudar

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir
White Monkey