QL/send_xlsx.py

60 lines
2.1 KiB
Python

"""Send the SANEF Qualys V3 xlsx to khalid.moutaouakil-ext@sanef.com via Gmail SMTP.
App Password lu depuis variable d'env GMAIL_APP_PASSWORD (jamais en dur dans le script).
"""
import os
import smtplib
import ssl
from email.message import EmailMessage
from pathlib import Path
SENDER = "kalid.moutaouakil@gmail.com"
RECIPIENT = "khalid.moutaouakil-ext@sanef.com"
ATTACHMENT = Path(r"C:\Claude\sanef\QL\docs\SANEF_Qualys_Tags_V3_RuleTypes_v2.xlsx")
password = os.environ.get("GMAIL_APP_PASSWORD")
if not password:
raise SystemExit("GMAIL_APP_PASSWORD non defini dans l'environnement")
password = password.replace(" ", "") # Gmail App Password sans espaces
msg = EmailMessage()
msg["From"] = SENDER
msg["To"] = RECIPIENT
msg["Subject"] = "SANEF Qualys - Tags V3 (taxonomie complete + descriptions)"
msg.set_content(
"Bonjour Khalid,\n\n"
"En piece jointe le tableau de reference de la taxonomie Qualys V3 :\n"
" - Feuille 1 : 23 tags dynamiques (OS, EQT, ENV, POS, NOM-LEGACY, TAG-EMV, TAG-OBS) avec couleurs, descriptions et requetes QQL\n"
" - Feuille 2 : 7 tags statiques (TAG-SED, TAG-SEI, TAG-ELS, TAG-DEC, TAG-INT, TAG-SIC, TAG-SIA)\n"
" - Feuille 3 : prefixes a creer manuellement (APP, BDD, VRF, MID, VULN)\n\n"
"Mises a jour de cette version :\n"
" - Renommage TYP -> EQT (Equipement)\n"
" - Descriptions OS-* et EQT-* harmonisees\n"
" - ENV-TST corrige : exclusion des postes Superviseur Peage (svp*)\n"
" - EQT-SRV idem (and not asset.name:svp*)\n\n"
"Cordialement,\n"
"SECOPS\n"
)
if not ATTACHMENT.exists():
raise SystemExit(f"Fichier introuvable : {ATTACHMENT}")
with ATTACHMENT.open("rb") as f:
msg.add_attachment(
f.read(),
maintype="application",
subtype="vnd.openxmlformats-officedocument.spreadsheetml.sheet",
filename=ATTACHMENT.name,
)
ctx = ssl.create_default_context()
with smtplib.SMTP("smtp.gmail.com", 587, timeout=30) as s:
s.ehlo()
s.starttls(context=ctx)
s.ehlo()
s.login(SENDER, password)
s.send_message(msg)
print(f"Mail envoye a {RECIPIENT} avec piece jointe {ATTACHMENT.name} ({ATTACHMENT.stat().st_size} bytes)")