Propósito: es una libraría para administrar mensajes de correo electrónico.
El correo electrónico es una de las formas más antiguas de comunicación digital,
pero sigue siendo una de las más populares. La libraría estándar de Python
incluye módulos para enviar, recibir y almacenar mensajes de correo electrónico por
medio de la librería email.
smtplib se comunica con un servidor de correo para entregar un mensaje. smtpd se
puede utilizar para crear un servidor de correo personalizado y proporciona clases
útiles para depurar la transmisión de correo electrónico en otras aplicaciones.
imaplib utiliza el protocolo IMAP para manipular mensajes almacenados en un servidor.
Proporciona una API de bajo nivel para clientes IMAP y puede consultar, recuperar, mover
y eliminar mensajes.
Los archivos de mensajes locales se pueden crear y modificar mailbox utilizando varios
formatos estándar, incluidos los populares formatos mbox y Maildir utilizados por
muchos programas de clientes de correo electrónico.
A continuación, un ejemplo de envió de correo electrónico, usando el servicio Gmail, usando una plantilla
de correo básica basado en una cadena de caracteres:
importsmtplib# Tu dirección desde donde envía el correoFROM_ADDRESS="TU_CORREO_GOOGLE_AQUÍ"# Tu contraseña de aplicación de Google del correo electrónico desde donde envía el correoFROM_ADDRESS_PASSWORD="TU_CONTRASEÑA_DE_APLICACIÓN_GOOGLE_AQUÍ"# Tu dirección del host SMTPSMTP_SERVER="smtp.gmail.com"# Tu puerto del host SMTPSMTP_PORT="587"remitente="leonardoc@plone.org"destinatarios=["leonardocaballero@gmail.com"]mensaje="""From: Macagua <leonardoc@plone.org>To: Leonardo Caballero <leonardocaballero@gmail.com>Subject: Prueba de Envios del SMTPEsto es un mensaje de prueba por correo electronico."""try:smtp=smtplib.SMTP(host=SMTP_SERVER,port=SMTP_PORT)smtp.starttls()smtp.login(FROM_ADDRESS,FROM_ADDRESS_PASSWORD)smtp.sendmail(remitente,destinatarios,mensaje)smtp.quit()print("Correo enviado correctamente")exceptException:print("Error: no se pudo enviar el correo")
El anterior código al ejecutar debe mostrar el siguiente mensaje:
Correo enviado correctamente
Y para captura todas las excepciones posibles, muestra el siguiente mensaje:
Error: no se pudo enviar el correo
El mensaje recibido en la cuenta Gmail desde el programa email_smtplib_demo1.py
luciría de la siguiente forma:
A continuación, un ejemplo de envió de correo electrónico, usando el servicio Gmail, acoplando variables
en una plantilla de correo básica basado en una cadena de caracteres:
importsmtplib# Tu dirección desde donde envía el correoFROM_ADDRESS="TU_CORREO_GOOGLE_AQUÍ"# Tu contraseña de aplicación de Google del correo electrónico desde donde envía el correoFROM_ADDRESS_PASSWORD="TU_CONTRASEÑA_DE_APLICACIÓN_GOOGLE_AQUÍ"# Tu dirección del host SMTPSMTP_SERVER="smtp.gmail.com"# Tu puerto del host SMTPSMTP_PORT="587"remitente="Macagua <leonardoc@plone.org>"destinatarios=["Leonardo Caballero <leonardocaballero@gmail.com>"]asunto_mensaje="Otro envio de prueba del SMTP"cuerpo_mensaje="Esto es un mensaje de prueba por correo electronico."mensaje=f"""From: {remitente}To: {", ".join(destinatarios)}Subject: {asunto_mensaje}{cuerpo_mensaje}"""try:smtp=smtplib.SMTP(host=SMTP_SERVER,port=SMTP_PORT)smtp.starttls()smtp.login(FROM_ADDRESS,FROM_ADDRESS_PASSWORD)smtp.sendmail(remitente,destinatarios,mensaje)smtp.quit()print("Correo enviado correctamente")exceptException:print("Error: no se pudo enviar el correo")
El anterior código al ejecutar debe mostrar el siguiente mensaje:
Correo enviado correctamente
Y para captura todas las excepciones posibles, muestra el siguiente mensaje:
Error: no se pudo enviar el correo
El mensaje recibido en la cuenta Gmail desde el programa email_smtplib_demo2.py
luciría de la siguiente forma:
A continuación, un ejemplo de envió de correo electrónico, usando el servicio Gmail, usando
una objeto de tipo Template acoplando variables, usando diversas excepciones
para manipular los posibles errores:
importosimportsmtplibfromstringimportTemplatefromemail.mime.multipartimportMIMEMultipartfromemail.mime.textimportMIMETextDIR_ARCHIVO=os.path.dirname(os.path.abspath(__file__))+os.sepARCHIVO=["email_contactos.txt","email_mensaje.txt"]# Dirección desde donde se envía el correoFROM_ADDRESS="TU_CORREO_GOOGLE_AQUÍ"# Contraseña de aplicación de la cuenta Google desde donde se envía el correoFROM_ADDRESS_PASSWORD="TU_CONTRASEÑA_DE_APLICACIÓN_GOOGLE_AQUÍ"# Dirección del servidor SMTPSMTP_SERVER="smtp.gmail.com"# Puerto del servidor SMTPSMTP_PORT="587"defleer_contacto(nombre_archivo):""" Devuelve dos tipo lista nombres y correos electrónicos que contienen nombres y direcciones de correo electrónico leídas de un archivo especificado por nombre de archivo. """nombres=[]correos=[]withopen(nombre_archivo,encoding="utf-8")asarchivo_contactos:forcontactoinarchivo_contactos:nombres.append(contacto.split()[0])correos.append(contacto.split()[1])returnnombres,correosdefleer_plantilla(nombre_archivo):""" Devuelve un objeto Template que incluye el contenido del archivo especificado por nombre de archivo. """withopen(nombre_archivo,encoding="utf-8")asarchivo_plantilla:contenido_archivo_plantilla=archivo_plantilla.read()returnTemplate(contenido_archivo_plantilla)defmain():""" Función principal del programa. """try:# leer contactosnombres,correos=leer_contacto(DIR_ARCHIVO+ARCHIVO[0])# leer mensaje de plantillamensaje_plantilla=leer_plantilla(DIR_ARCHIVO+ARCHIVO[1])# configurar el servidor SMTPsmtp=smtplib.SMTP(host=SMTP_SERVER,port=SMTP_PORT)smtp.starttls()smtp.login(FROM_ADDRESS,FROM_ADDRESS_PASSWORD)# Para cada contacto, envíe el correo electrónico:fornombre,correoinzip(nombres,correos):# crear un mensajemsg=MIMEMultipart()# agregue el nombre de la persona real a la plantilla de mensajemensaje=mensaje_plantilla.substitute(NOMBRE_PERSONA=nombre.title())# Imprime el cuerpo del mensaje por nuestro bienprint(mensaje)# configurar los parámetros del mensajemsg["From"]=FROM_ADDRESSmsg["To"]=correomsg["Subject"]="Esto es un mensaje PRUEBA"# añadir en el cuerpo del mensajemsg.attach(MIMEText(mensaje,"plain"))# enviar el mensaje a través del servidor configurado anteriormente.smtp.send_message(msg)delmsg# Terminar la sesión SMTP y cerrar la conexiónsmtp.quit()print("Correo(s) enviado(s) correctamente")exceptsmtplib.SMTPConnectErrorase:print(f"Error: Conexión al servidor de correo fallo: {e}")exceptsmtplib.SMTPAuthenticationErrorase:print(f"Error: Credenciales de acceso al correo no coinciden: {e}")exceptExceptionase:print(f"Error: no se pudo enviar el correo: {e}")if__name__=="__main__":main()
Estimado(a) ${NOMBRE_PERSONA},
Este es un mensaje de prueba.
Espero tengas una gran semana!
Sinceramente
El anterior código al ejecutar debe mostrar el siguiente mensaje:
Estimado(a) Leonardo,Este es un mensaje de prueba.Espero tengas una gran semana!SinceramenteEstimado(a) Macagua,Este es un mensaje de prueba.Espero tengas una gran semana!SinceramenteCorreo(s) enviado(s) correctamente
Cuando hay error de conexión al servidor SMTP, muestra el siguiente mensaje:
Error: Conexión al servidor de correo fallo: [Errno -2] Name or service not known
Cuando hay error de en las credenciales de acceso al correo, muestra el siguiente mensaje:
Error: Credenciales de acceso al correo no coinciden: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8 https://support.google.com/mail/?p=BadCredentials g24-20020ab02058000000b00418c627a089sm538715ual.7 - gsmtp')
Y para captura todas las excepciones posibles, muestra el siguiente mensaje:
Error: no se pudo enviar el correo: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8 https://support.google.com/mail/?p=BadCredentials h199-20020a1f9ed0000000b003b7d46d80b6sm569582vke.16 - gsmtp')
Puede ejecutar distribución binaria hello.exe generada, el cual mostrara la siguiente pantalla.
El mensaje recibido en la cuenta Gmail desde el programa emails_gmail_send.py
luciría de la siguiente forma:
Además de los procesos de permisos específicos de Gmail (que incluyen aplicaciones menos seguras,
etc.), estas secuencias de comandos y ejemplos funcionarían con casi cualquier otro servicio de
correo que proporcione conectividad SMTP, siempre que tenga la dirección del servidor y el puerto
necesarios.
Ver también
Consulte la sección de lecturas suplementarias
del entrenamiento para ampliar su conocimiento en esta temática.