137 lines
5.6 KiB
Python
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() |