137 lines
5.6 KiB
Python

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email import encoders
import os
import pandas as pd
from datetime import datetime
from tqdm import tqdm
def determinar_periodo():
hora_actual = datetime.now().hour
if 6 <= hora_actual < 12:
return "Buen día"
elif 12 <= hora_actual < 18:
return "Buena tarde"
elif 18 <= hora_actual < 24:
return "Buena noche"
else:
return "Madrugada"
def build_message(saludo_hora, destinatarios, file_path, email_usuario, oficio_numero):
msg = MIMEMultipart("related")
msg["From"] = email_usuario
msg["To"] = ", ".join(destinatarios)
msg["Subject"] = f"Respuesta a solicitud de conectividad, oficio número: {oficio_numero}"
# Abre y lee la imagen del logo
with open("./img_cfe/logo.png", "rb") as fp:
logo_img = MIMEImage(fp.read(), "svg+xml") # Tipo de imagen para SVG
# 📌 Asigna un ID único y un nombre de archivo
logo_img.add_header("Content-ID", "<logo_cfe>")
logo_img.add_header("Content-Disposition", "inline", filename="logo.png")
msg.attach(logo_img)
# 📝 Código HTML para el cuerpo del correo
cuerpo_html = f"""
<!DOCTYPE html>
<html>
<head>
<title>Respuesta a solicitud de conectividad</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
</style>
</head>
<body>
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td align="center" style="padding: 20px 0;">
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="600" class="email-container">
<tr>
<td align="right" class="header">
<img src="cid:logo_cfe" alt="CFE" class="logo-header">
<h2>Coordinación TELECOM</h2>
<h3>Conectividad Social</h3>
</td>
</tr>
<tr>
<td class="content">
<p class="saludo">{saludo_hora};</p>
<p>Por medio del presente se le hace llegar la respuesta a su solicitud de conectividad, adjunto encontrará el documento en mención.</p>
<p>Este documento contiene información importante referente a su caso en particular.</p>
<p>Saludos cordiales.</p>
</td>
</tr>
<tr>
<td class="attachment-note">
<p>Adjunto: <strong>Oficio No. TELECOM/CS/{oficio_numero}/2025</strong></p>
</td>
</tr>
<tr>
<td class="signature">
<!-- <p><strong>Ing. Brenda Lidia Escobar Méndez</strong></p> -->
<!-- <p>Encargada de Conectividad Social</p> -->
<!-- <p>Dirección de Servicios Especializados y Estrategia Comercial</p> -->
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
"""
# 📌 Cambia 'plain' a 'html' para el tipo de contenido
msg.attach(MIMEText(cuerpo_html, "html"))
if os.path.exists(file_path):
with open(file_path, "rb") as adj:
parte = MIMEBase("application", "octet-stream")
parte.set_payload(adj.read())
encoders.encode_base64(parte)
parte.add_header("Content-Disposition", f"attachment; filename={os.path.basename(file_path)}")
msg.attach(parte)
else:
print(f"⚠️ Archivo no encontrado: {file_path}, se envía sin adjunto.")
return msg
def main():
email_usuario = "david.itehua@aem.gob.mx"
app_password = "lcdq hwvq wxxa pbcn"
smtp_server = "smtp.gmail.com"
smtp_port = 465
# Carga de Excel
file_xlsx = "./Control Oficios Conectividad 2025 .xlsx"
# df = pd.read_excel(file_xlsx)[["No", "FECHA DE RECEPCION", "REMITENTE", "ASUNTO", "CORREO ELECTRÓNICO", "Oficio_no", "documento"]]
df = pd.read_excel(file_xlsx, dtype={'Oficio_no': str})[["No", "FECHA DE RECEPCION", "REMITENTE", "ASUNTO", "CORREO ELECTRÓNICO", "Oficio_no", "documento"]]
saludo = determinar_periodo()
# Abrir UNA sola conexión
with smtplib.SMTP_SSL(smtp_server, smtp_port) as server:
server.login(email_usuario, app_password)
for _, row in tqdm(df.iterrows(), total=len(df), desc="Enviando correos"):
emails_raw = str(row["CORREO ELECTRÓNICO"])
destinatarios = [e.strip() for e in emails_raw.replace(";", ",").split(",") if e.strip()]
file_to_send = f'./Docs/{row["documento"]}'
oficio_numero = row["Oficio_no"]
msg = build_message(saludo, destinatarios, file_to_send, email_usuario, oficio_numero)
try:
server.send_message(msg, from_addr=email_usuario, to_addrs=destinatarios)
except Exception as e:
print(f"❌ Error enviando a {destinatarios}: {e}")
if __name__ == "__main__":
main()