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 CorreoElectronico FROM [dbo].[Clientes.Reporte.Notificaciones] Where id = 1 or id = 16 ")
cursor . execute ( " Select CorreoElectronico from [Clientes.Reporte.Notificaciones] where TipoReporte = ' RptFacturasPagadas,RptSegregacion ' or id = 1 or Id = 5 " )
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"]
# }