83 lines
2.8 KiB
Python
83 lines
2.8 KiB
Python
import smtplib
|
|
from email.mime.text import MIMEText
|
|
from email.mime.multipart import MIMEMultipart
|
|
from email.mime.base import MIMEBase
|
|
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, nombre_destinatario, file_path, email_usuario):
|
|
msg = MIMEMultipart()
|
|
msg["From"] = email_usuario
|
|
msg["To"] = ", ".join(destinatarios)
|
|
msg["Subject"] = "Respuesta a solicitud de conectividad"
|
|
|
|
cuerpo = (
|
|
f"{saludo_hora} {nombre_destinatario};\n\n"
|
|
"Por medio del presente se le hace llegar la respuesta a su solicitud de conectividad, "
|
|
"adjunto encontrará el documento en mención.\n\nSaludos cordiales."
|
|
)
|
|
msg.attach(MIMEText(cuerpo, "plain"))
|
|
|
|
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", "FILE_TO_SEND"]]
|
|
|
|
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"):
|
|
# Normaliza separadores
|
|
emails_raw = str(row["CORREO ELECTRÓNICO"])
|
|
destinatarios = [e.strip() for e in emails_raw.replace(";", ",").split(",") if e.strip()]
|
|
|
|
file_to_send = row["FILE_TO_SEND"]
|
|
|
|
msg = build_message(saludo, destinatarios, row["REMITENTE"], file_to_send, email_usuario)
|
|
|
|
try:
|
|
server.send_message(msg, from_addr=email_usuario, to_addrs=destinatarios)
|
|
# print(f"✅ Correo enviado a: {', '.join(destinatarios)}")
|
|
except Exception as e:
|
|
print(f"❌ Error enviando a {destinatarios}: {e}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|