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