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 las fechas de los últimos dos meses today = datetime.date.today() last_month = today.replace(day=1) - datetime.timedelta(days=1) two_months_ago = last_month.replace(day=1) - datetime.timedelta(days=1) # Convertir las fechas a formato de cadena YYYY-MM-DD start_date = two_months_ago.replace(day=1).strftime("%Y-%m-%d") end_date = last_month.strftime("%Y-%m-%d") cliente = 1725; tipoOperacion = 2 # Obtener el nombre de los últimos dos meses en español mes = last_month.strftime("%B").capitalize() mes_anterior = two_months_ago.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 = 'RptFacturasCruzadas' ") 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.Facturas.Cruzadas] (?, ?, ?,?)}", (start_date, end_date, tipoOperacion, cliente)) # cursor.execute("{CALL [Reportes.Web.Clientes.Factura.Pedimentos.Pagados.Get] (?,?,?,?)}", (start_date, end_date, tipoOperacion, cliente)) 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'ReporteMensualFacturasCruzadas_{mes_anterior}_{mes}.xlsx' df1.to_excel(excel_file_1, 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_anterior} - {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 reporte mensual de Facturas Cruzadas correspodientes a los 2 meses inmediatos anteriores ({mes_anterior} and {mes}). En caso de dudas o aclaraciones conctactar a : (jguel@gemcousa.com) Saludos. """.format(mes=mes, mes_anterior=mes_anterior) 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]: 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 mensual enviado exitosamente por correo electrónico.") # Eliminar los archivos Excel después de enviar el correo electrónico for excel_file in [excel_file_1]: 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"] # }