import smtplib from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email.mime.text import MIMEText from email import encoders import pyodbc import pandas as pd import json import datetime import os # Obtiene la ruta del directorio donde se encuentra el script directorio_script = os.path.dirname(os.path.abspath(__file__)) # Establece el directorio de trabajo actual os.chdir(directorio_script) # Cargar la configuración del correo electrónico desde el archivo JSON with open('config.json', 'r') as config_file: config = json.load(config_file) smtp_server = config['EmailServer'] smtp_port = config['EmailPort'] # Tus credenciales de correo electrónico desde el archivo JSON sender_email = config['EmailUser'] sender_password = config['EmailPassword'] # Obtener la fecha de inicio y fin del mes anterior today = datetime.date.today() first_day_of_month = today.replace(day=1) last_day_of_previous_month = first_day_of_month - datetime.timedelta(days=1) first_day_of_previous_month = last_day_of_previous_month.replace(day=1) # Convertir las fechas a formato de cadena YYYY-MM-DD start_date = first_day_of_previous_month.strftime("%Y-%m-%d") end_date = last_day_of_previous_month.strftime("%Y-%m-%d") # Obtener el nombre del mes que se está reportando en español mes = last_day_of_previous_month.strftime("%B").capitalize() # Cargar la configuración de la base de datos desde el archivo JSON with open('config.json', 'r') as config_file: config = json.load(config_file) conn_str = ( f"DRIVER=ODBC Driver 17 for SQL Server;" f"SERVER={config['server']};" f"DATABASE={config['database']};" f"UID={config['username']};" f"PWD={config['password']};" ) # Conectar a la base de datos conn = pyodbc.connect(conn_str) try: cursor = conn.cursor() # Ejecutar la consulta SQL para obtener los correos electrónicos de la tabla cursor.execute("SELECT * from [Clientes.Reporte.Notificaciones] where id = 1 or id = 5 OR TipoReporte = 'RptFacturasPagadas,RptSegregacion' ") rows = cursor.fetchall() # Obtener una lista de correos electrónicos recipients = [row.CorreoElectronico for row in rows] # Ejecutar el primer procedimiento almacenado y guardar los resultados en un DataFrame cursor.execute("{CALL [Reportes.Web.Clientes.Amazon.Segregacion.Get] (?, ?)}", (start_date, end_date)) rows = cursor.fetchall() df1 = pd.DataFrame([tuple(row) for row in rows], columns=[desc[0] for desc in cursor.description]) # Guardar el DataFrame en un archivo Excel con el mes en el nombre del archivo excel_file_1 = f'ReporteMensualSegregacion_{mes}.xlsx' df1.to_excel(excel_file_1, index=False) # Ejecutar el segundo procedimiento almacenado y guardar los resultados en otro DataFrame cursor.execute("{CALL [Clientes.Amazon.Invoice.FacturasPagadas.Get] (?, ?)}", (start_date, end_date)) rows = cursor.fetchall() df2 = pd.DataFrame([tuple(row) for row in rows], columns=[desc[0] for desc in cursor.description]) # Guardar el segundo DataFrame en otro archivo Excel con el mes en el nombre del archivo excel_file_2 = f'ReporteMensualFacturasPagadas_{mes}.xlsx' df2.to_excel(excel_file_2, index=False) # Configurar el correo electrónico msg = MIMEMultipart() msg['From'] = sender_email msg['To'] = ', '.join(recipients) # Lista de destinatarios separados por comas msg['Subject'] = f'Reportes Mensuales GEMCO - {mes}' # Agregar el cuerpo del mensaje # body = """ Se anexan reportes mensual de segregados y reporte de factura pagadas correspodientes al mes inmediato anterior. # En caso de dudas o aclaraciones conctactar a Viviana Jara: (vjara@gemcousa.com) o Susana Sánchez: (ssanchez@gemcousa.com) # Saludos. """ body ="""Se anexan reportes mensual de segregados y reporte de factura pagadas correspodientes al mes inmediato anterior. En caso de dudas o aclaraciones conctactar a Viviana Jara:(vjara@gemcousa.com) o Susana Sánchez:(ssanchez@gemcousa.com) Saludos. """ centered_body = body.strip().center(70) msg.attach(MIMEText(body, 'plain')) # Adjuntar los archivos Excel al correo electrónico for excel_file in [excel_file_1, excel_file_2]: with open(excel_file, 'rb') as attachment: part = MIMEBase('application', 'octet-stream') part.set_payload(attachment.read()) encoders.encode_base64(part) part.add_header('Content-Disposition', f'attachment; filename= {excel_file}') msg.attach(part) # Establecer la conexión al servidor SMTP server = smtplib.SMTP(smtp_server, smtp_port) server.starttls() server.login(sender_email, sender_password) # Enviar el correo server.sendmail(sender_email, recipients, msg.as_string()) print("Reportes mensuales enviados exitosamente por correo electrónico.") # Eliminar los archivos Excel después de enviar el correo electrónico for excel_file in [excel_file_1, excel_file_2]: os.remove(excel_file) except Exception as e: print(f"Error al enviar los reportes mensuales por correo: {e}") finally: # Cerrar la conexión SMTP y la conexión con la base de datos if 'server' in locals(): server.quit() conn.close() # Credenciales producion #{ # "server": "100.10.10.1", # "database": "GEMCO", # "username": "admin", # "password": "DBAdmin1234$.", # "EmailUser": "noreply@gemcousa.mx", # "EmailPassword": "Mx77lf%02", # "EmailServer": "smtp.ionos.com", # "EmailPort": 587, # "recipients": ["lrendon@gemcousa.com", "destinatario2@example.com", "destinatario3@example.com"] # } # { credenciales maquina local # "server": ".", # "database": "GEMCO", # "username": "sa", # "password": "Chispa10", # "EmailUser": "noreply@gemcousa.mx", # "EmailPassword": "Mx77lf%02", # "EmailServer": "smtp.ionos.com", # "EmailPort": 587, # "recipients": ["lrendon@gemcousa.com", "destinatario2@example.com", "destinatario3@example.com"] # }