Enviar un correo con Python (smtplib)
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 + "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
-
Le agregue esta función a tu agenda y funciona perfecto! Gracias.
-
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 😉
-
-
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 -
Hola tu segundo ejemplo me funciono muy bien excepto por algunos pequeños cambios que tuve que hacer por que estoy en python 3
-
Exelente Irma, Saludos y gracias por visitar el blog!!!
-
Hola Irma me podrias indicar cuales cambios realizaste por favor, estoy modificando y ya voy por el while que me da error de sintaxis
-
-
Un "while true" y un "break" de por medio... Mal
-
Excelente!
Estaba viendo varios blogs en los que en lugar de hacer las cosas sencillas se complican instalando librerias como MIMEText.
Felicitaciones!-
Muchas Gracias Sebas!!!
Saludos
-
-
tu primer ejemplo me funciono bien, me gustaría saber en donde iría el if y como seria el scrip en un complemento.
-
Hola, no entiendo bien tu pregunta. Los otros ejemplos no te funcionaron? que error tienes?
Saludos -
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? -
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:
----EnviarCorreoPero quiero que sepas que fue a modo de ejemplo de para que se podría utilizar enviar correo con Python!!!
Saludos, Diego
-
-
no me sale me sale contraseña no autentificada
-
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!!!
-
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.
-
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() -
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
-
-
Una pregunta: ¿Como podría enviar el correo con Tkinter?
-
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
-
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?? -
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
-
-
Oye, se podría, con este mismo software, enviar imágenes? Gracias
-
hola, buenas, quisiera saber como puedo enviar un archivo txt, soy nuevo, disculpa la molestia
-
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.
-
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.
-
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.
-
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 -
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
Creo que en el código has publicado tu contraseña...