|
|
|
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"]
|
|
|
|
# }
|