import os import pyodbc import pandas as pd import datetime import calendar import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication # Establecer la conexión a la base de datos conn = pyodbc.connect('DRIVER={SQL Server};SERVER=.;DATABASE=GEMCO;') # Crear el cursor cursor = conn.cursor() # Obtener la fecha actual FechaActual = datetime.date.today() # FechaActual_str = input("Ingresa la fecha actual (YYYY-MM-DD): ") # FechaActual = datetime.datetime.strptime(FechaActual_str, "%Y-%m-%d").date() # Calcular el primer día y el último día del mes anterior según la fecha actual if FechaActual.month == 1: # Si es el primer día del año, obtener el mes anterior del año anterior PrimerDiaMesAnterior = datetime.date(FechaActual.year - 1, 12, 1) UltimoDiaMesAnterior = datetime.date(FechaActual.year - 1, 12, 31) else: # Si no es el primer día del año, obtener el mes anterior del mismo año PrimerDiaMesAnterior = datetime.date(FechaActual.year, FechaActual.month - 1, 1) UltimoDiaMesAnterior = PrimerDiaMesAnterior.replace(day=calendar.monthrange(PrimerDiaMesAnterior.year, PrimerDiaMesAnterior.month)[1]) # Convertir las fechas a formato de cadena (YYYY-MM-DD) Inicio = PrimerDiaMesAnterior.strftime('%Y-%m-%d') print(Inicio) Fin = UltimoDiaMesAnterior.strftime('%Y-%m-%d') print(Fin) TipoOperacion = '2' Cliente = '1725' sql = "{CALL [dbo].[Reportes.Web.Clientes.Facturas.Cruzadas] (?, ?, ?, ?)}" params = (Inicio, Fin, TipoOperacion, Cliente) cursor.execute(sql, params) # Obtener los resultados Resultados = cursor.fetchall() # Cerrar la conexión cursor.close() conn.close() # Definir las columnas columnas = ['Referencia', 'Pedimento', 'Clave', 'FechaFirmaBanco', 'TipoCambio', 'PesoBruto', 'PaisVendedor', 'PaisOrigen', 'NumFacturas', 'Factura', 'ValorFactura', 'Fraccion', 'Descripcion', 'nClave', 'CantFacturas', 'ValorAduana', 'Incrementables', 'Advalorem', 'DTA', 'IVA', 'Efectivo', 'Total', 'Destino', 'Cruce', 'Remite', 'Caja', 'ValorComercial', 'Incoterm'] # Modificar la estructura de los datos DatosModificados = [list(item) for item in Resultados] # Crear el DataFrame a partir de los datos df = pd.DataFrame(DatosModificados, columns=columnas) # Obtener la ruta de la carpeta de descargas del usuario CarpetaDescargas = os.path.expanduser("~") + "\\Downloads\\" # Definir el nombre del archivo NombreArchivo = 'RptCliente1725InformeMensual.xlsx' # Concatenar la ruta de la carpeta de descargas con el nombre del archivo RutaArchivo = CarpetaDescargas + NombreArchivo # Guardar el DataFrame en un archivo Excel en la carpeta de descargas df.to_excel(RutaArchivo, index=False) # Detalles del correo electrónico remitente = 'noreply@gemcousa.mx' destinatarios = ['elchurito17@gmail.com', 'lrendon@gemcousa.com' ] asunto = 'Adjunto: Informe Mensual Cliente 1725' cuerpo = 'Hola, adjunto encontrarás el informe mensual.' # Configurar los detalles del servidor de correo saliente servidor_smtp = 'smtp.ionos.com' puerto_smtp = 587 usuario_smtp = 'noreply@gemcousa.mx' contraseña_smtp = 'Mx77lf%02' # Crear el mensaje de correo electrónico mensaje = MIMEMultipart() mensaje['From'] = remitente mensaje['To'] = ', '.join(destinatarios) mensaje['Subject'] = asunto # Agregar el cuerpo del mensaje mensaje.attach(MIMEText(cuerpo, 'plain')) # Adjuntar el archivo Excel al mensaje with open(RutaArchivo, 'rb') as archivo: parte_adjunta = MIMEApplication(archivo.read(), Name=os.path.basename(RutaArchivo)) parte_adjunta['Content-Disposition'] = f'attachment; filename="{os.path.basename(RutaArchivo)}"' mensaje.attach(parte_adjunta) # Establecer la conexión con el servidor de correo saliente conexion_smtp = smtplib.SMTP(servidor_smtp, puerto_smtp) conexion_smtp.starttls() conexion_smtp.login(usuario_smtp, contraseña_smtp) # Enviar el mensaje texto_mensaje = mensaje.as_string() conexion_smtp.sendmail(remitente, destinatarios, texto_mensaje) # Cerrar la conexión conexion_smtp.quit() print("El archivo se ha enviado por correo electrónico.")