parent
d3de9a7c40
commit
e46aedb974
@ -0,0 +1,161 @@ |
|||||||
|
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"] |
||||||
|
# } |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,13 @@ |
|||||||
|
{ |
||||||
|
"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"] |
||||||
|
} |
||||||
|
|
||||||
|
|
Loading…
Reference in new issue