import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import pyodbc import json import datetime # Cargar la información de conexión desde el archivo JSON with open('config.json', 'r') as config_file: config = json.load(config_file) # Crear una cadena de conexión usando la información del archivo JSON en este momento esta la conexion a DB local 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() # fecha = '2023-09-13' # Ejemplo de fecha fecha = datetime.date.today() cursor.execute("{CALL NotiVigenciaDoda(?)}", fecha) # Recuperar los resultados del procedimiento almacenado rows = cursor.fetchall() # Configurar el servidor de correo electrónico saliente (SMTP) desde el archivo JSON with open('config.json', 'r') as email_config_file: email_config = json.load(email_config_file) smtp_server = email_config['EmailServer'] smtp_port = email_config['EmailPort'] # Tus credenciales de correo electrónico desde el archivo JSON sender_email = email_config['EmailUser'] sender_password = email_config['EmailPassword'] factura_data = {} # Iterar a través de los resultados y agruparlos por factura for row in rows: invoice = row.Invoice if invoice not in factura_data: factura_data[invoice] = [] factura_data[invoice].append(row) # Crear un diccionario para almacenar los correos de CorreosResponsables, NotificacionAA y CorreosTipoViaje por factura correos_por_factura = {} # Iterar a través de los resultados y agrupar los correos por factura for row in rows: invoice = row.Invoice if invoice not in correos_por_factura: correos_por_factura[invoice] = {'CorreosResponsables': [], 'NotificacionAA': [], 'CorreoTipoViaje': []} correos_responsables = row.CorreosResponsables.split(',') if row.CorreosResponsables else [] notificacion_aa = row.NotificacionAA.split(',') if row.NotificacionAA else [] correos_tipo_viaje = row.CorreoTipoViaje.split(',') if row.CorreoTipoViaje else [] correos_por_factura[invoice]['CorreosResponsables'].extend(correos_responsables) correos_por_factura[invoice]['NotificacionAA'].extend(notificacion_aa) correos_por_factura[invoice]['CorreoTipoViaje'].extend(correos_tipo_viaje) for invoice, correos_en_factura in correos_por_factura.items(): correos_responsables = correos_en_factura['CorreosResponsables'] notificacion_aa = correos_en_factura['NotificacionAA'] correos_tipo_viaje = correos_en_factura['CorreoTipoViaje'] # Obtener los datos comunes para la factura (fecha, invoice, caja, vigenciaDoda, notificacion) first_row = factura_data[invoice][0] fechaActual = first_row.FechaActual caja = first_row.Caja vigenciaDoda = first_row.VigenciaDODA notificacion = first_row.Notificacion # Crear el mensaje de correo electrónico msg = MIMEMultipart() msg['From'] = sender_email msg['To'] = ', '.join(correos_responsables + notificacion_aa + correos_tipo_viaje) # Agregar destinatarios al campo "Para" msg['Subject'] = f"Información de factura {invoice}" # Crear el cuerpo del mensaje con los datos de la factura en una tabla message = f"" message += f"

Factura {invoice}

" message += f"" message += f"" message += f"
Fecha ActualInvoiceCajaVigenciaDODANotificacion
{fechaActual}{invoice}{caja}{vigenciaDoda}{notificacion}

" message += "" msg.attach(MIMEText(message, 'html')) try: # 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 con los destinatarios en el campo "Para" server.sendmail(sender_email, correos_responsables + notificacion_aa + correos_tipo_viaje, msg.as_string()) print(f"Correo enviado a CorreosResponsables, NotificacionAA y CorreosTipoViaje de factura {invoice}") # Cerrar la conexión SMTP server.quit() except Exception as e: print(f"Error al enviar correo de factura {invoice}: {e}") except Exception as e: print("Error al conectarse:", e) # Procedimiento almacenado de sql server. # Create procedure [dbo].[NotiVigenciaDoda] # ( # @Fecha Date # ) # as # begin # SELECT # @Fecha AS FechaActual, # f.[Invoice], # f.[Ruta] AS Caja, # f.[VigenciaDODA], # -- f.[TipoViaje], # CorreosResponsables, # ce.NotificacionAA, # CASE # WHEN DATEDIFF(DAY, @Fecha, f.[VigenciaDODA]) = 1 THEN 'Vigencia Documentos 1 Dia.' # WHEN DATEDIFF(DAY, @Fecha, f.[VigenciaDODA]) = 0 THEN 'Vigencia Documentos 0 Dias.' # WHEN @Fecha > f.VigenciaDODA THEN 'Documentos Vencidos' # END AS Notificacion, # (SELECT # CASE # WHEN f.[TipoViaje] = 1 THEN ce.NotificacionZINCDirectos # WHEN f.[TipoViaje] = 2 THEN ce.NotificacionZINCTransbordos # ELSE NULL # END # ) AS CorreoTipoViaje # FROM dbo.Facturas f # LEFT JOIN dbo.CatResponsables cr ON f.ResponsableCruce = cr.Responsable # CROSS JOIN [Config.Emails] ce # OUTER APPLY ( # SELECT STRING_AGG(cc.Correo, ', ') AS CorreosResponsables # FROM dbo.[CatResponsables.Correos] cc # WHERE cr.id = cc.IdResponsable # ) CorreosSubquery # WHERE ( # DATEDIFF(DAY, @Fecha, f.[VigenciaDODA]) = 1 # OR DATEDIFF(DAY, @Fecha, f.[VigenciaDODA]) = 0 # OR @Fecha > f.VigenciaDODA ) # AND f.Activo = 1 # GROUP BY f.[Invoice], f.[Ruta], f.[VigenciaDODA] , f.[TipoViaje] , ce.NotificacionZINCDirectos , ce.NotificacionZINCTransbordos, ce.NotificacionAA, CorreosResponsables # ORDER BY VigenciaDODA; # end