En nuestro artículo Enviar correo electrónico en HTML y con adjuntos vía SMTP explicamos cómo construir un mensaje y enviarlo a través de un servidor SMTP en Python. El proveedor de correo electrónico de Google, Gmail, soporta perfectamente el protocolo SMTP en la dirección smtp.gmail.com
. Sin embargo, al intentar ejecutar el siguiente código de prueba para enviar un correo electrónico vía Gmail desde Python obtendremos un error de autenticación:
from email.message import EmailMessage import smtplib remitente = "direccion@gmail.com" destinatario = "destinatario@ejemplo.com" mensaje = "¡Hola, mundo!" email = EmailMessage() email["From"] = remitente email["To"] = destinatario email["Subject"] = "Correo de prueba" email.set_content(mensaje) smtp = smtplib.SMTP_SSL("smtp.gmail.com") smtp.login(remitente, "clave_de_gmail_123") smtp.sendmail(remitente, destinatario, email.as_string()) smtp.quit()
La excepción generada por este código es más o menos esta:
Traceback (most recent call last):
File "test_gmail.py", line 15, in
smtp.login(remitente, "clave_de_gmail_123")
...
smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8 https://support.google.com/mail/?p=BadCredentials x12-20020ab0640c000000b00384293c4199sm1462401uao.23 - gsmtp')
Aunque la dirección de correo electrónico de Gmail y la contraseña sean correctas, el error se produce porque desde el 30 de mayo de 2022 Google ya no soporta enviar correos electrónicos vía el protocolo SMTP indicando la contraseña de nuestra cuenta. Sin embargo, podemos seguir haciendo uso de este código y del protocolo SMTP si generamos una clave especial para nuestro programa de Python (contraseña de aplicación, según la terminología de Google), en lugar de utilizar la contraseña de Google, que constituye un riesgo importante para la seguridad de nuestra cuenta.
Para generar una contraseña de aplicación, la cuenta de Gmail desde la cual queremos enviar el correo electrónico debe tener activada la autenticación o verificación en dos pasos. Sin este requisito no es posible crear una clave especial para nuestro código de Python. Así que el primer paso es ir a la configuración de nuestra cuenta de Google y en la sección «Seguridad» activar la verificación en dos pasos. Hecho esto, veremos en esa misma sección la opción «Contraseñas de aplicaciones»:
Tras presionar en esa opción, veremos una pantalla para seleccionar la aplicación para la cual queremos generar la contraseña. Tocaremos en la última opción «Otra (nombre personalizado)», como se muestra en la imagen:
Google solicitará que escribamos un nombre para nuestra aplicación:
Presionemos el botón «Generar» y se mostrará en pantalla una contraseña de 16 dígitos (por ejemplo, fzolfunvtkqzovgv
). Asegúrate de copiar esa clave porque no se puede volver a visualizar.
Ahora solo nos queda pegar esa contraseña en nuestro código de Python, pasándosela como argumento a smtp.login()
:
from email.message import EmailMessage import smtplib remitente = "direccion@gmail.com" destinatario = "destinatario@ejemplo.com" mensaje = "¡Hola, mundo!" email = EmailMessage() email["From"] = remitente email["To"] = destinatario email["Subject"] = "Correo de prueba" email.set_content(mensaje) smtp = smtplib.SMTP_SSL("smtp.gmail.com") smtp.login(remitente, "fzolfunvtkqzovgv") smtp.sendmail(remitente, destinatario, email.as_string()) smtp.quit()
¡Listo! Para enviar el correo en formato HTML o añadir archivos adjuntos, véase el artículo mencionado al principio: Enviar correo electrónico en HTML y con adjuntos vía SMTP.
Curso online 👨💻
¡Ya lanzamos el curso oficial de Recursos Python en Udemy!
Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter
en 2024.
Consultoría 💡
Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.
André Aleixo says:
Muchas gracias.
jose says:
exelente articulo bien explicado y funciona
Lucas says:
Buena aportacion