Files
utilidades-python/envio-reportes-correo/enviar-reporte.py

100 lines
3.4 KiB
Python

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import os
import glob
from dotenv import load_dotenv # Importamos la función para cargar el .env
# Cargar las variables de entorno desde el archivo .env
load_dotenv()
def enviar_correo_con_adjunto_reciente(
servidor_smtp, puerto_smtp, usuario, contrasena,
remitente, destinatario_principal, destinatario_cc,
asunto, cuerpo_mensaje, carpeta_adjuntos
):
"""
Busca el archivo más reciente en una carpeta y lo envía por correo.
"""
# 1. Encontrar el archivo más reciente en la carpeta dada
try:
ruta_completa = os.path.abspath(carpeta_adjuntos)
archivos = glob.glob(os.path.join(ruta_completa, '*'))
if not archivos:
print(f"No se encontraron archivos en la carpeta: {ruta_completa}")
return
archivos.sort(key=os.path.getmtime, reverse=True)
archivo_mas_reciente = archivos[0] # Tomamos el primer elemento (el más reciente)
nombre_archivo = os.path.basename(archivo_mas_reciente)
print(f"Archivo más reciente encontrado: {nombre_archivo}")
except Exception as e:
print(f"Error al buscar archivos en la carpeta: {e}")
return
# 2. Crear el mensaje de correo
msg = MIMEMultipart()
msg['From'] = remitente
msg['To'] = destinatario_principal
msg['Cc'] = destinatario_cc
msg['Subject'] = asunto
msg.attach(MIMEText(cuerpo_mensaje, 'plain'))
# 3. Adjuntar el archivo
try:
with open(archivo_mas_reciente, "rb") as attachment:
parte = MIMEBase("application", "octet-stream")
parte.set_payload(attachment.read())
encoders.encode_base64(parte)
parte.add_header(
"Content-Disposition",
f"attachment; filename={nombre_archivo}",
)
msg.attach(parte)
except IOError as e:
print(f"Error al adjuntar el archivo {archivo_mas_reciente}: {e}")
return
# 4. Enviar el correo usando SMTP de Zimbra
try:
servidor = smtplib.SMTP(servidor_smtp, puerto_smtp)
servidor.ehlo()
servidor.starttls()
servidor.ehlo()
servidor.login(usuario, contrasena)
destinatarios_totales = [destinatario_principal, destinatario_cc]
servidor.sendmail(remitente, destinatarios_totales, msg.as_string())
servidor.quit()
print("Correo enviado exitosamente.")
except smtplib.SMTPException as e:
print(f"Error al enviar el correo: {e}")
except Exception as e:
print(f"Ocurrió un error inesperado: {e}")
# --- INVOCACIÓN DE LA FUNCIÓN USANDO VARIABLES DE ENTORNO ---
if __name__ == "__main__":
# Obtenemos los valores del archivo .env usando os.getenv()
enviar_correo_con_adjunto_reciente(
servidor_smtp=os.getenv("SMTP_SERVER"),
puerto_smtp=int(os.getenv("SMTP_PORT")), # Convertimos el puerto a entero
usuario=os.getenv("USER"),
contrasena=os.getenv("PASS"),
remitente=os.getenv("REMITENTE"),
destinatario_principal=os.getenv("DESTINATARIO_TO"),
destinatario_cc=os.getenv("DESTINATARIO_CC"),
asunto=os.getenv("ASUNTO_CORREO"),
cuerpo_mensaje=os.getenv("CUERPO_CORREO"),
carpeta_adjuntos=os.getenv("CARPETA_ADJUNTOS")
)