import logging import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText logger = logging.getLogger("ovh_factures.fetcher") def _as_header(value) -> str: # Convertit en chaîne pour les en-têtes MIME; join pour listes/tuples. if isinstance(value, (list, tuple, set)): return ", ".join(map(str, value)) return str(value) def _as_rcpt_list(value): # Liste de destinataires pour SMTP if value is None: return [] if isinstance(value, (list, tuple, set)): return [str(v) for v in value] return [str(value)] def construct_html(bills: list[tuple[str, str]]) -> str: try: rows = [ f"
  • Facture n°{b} — " f"émise le {d}
  • " for b, d in bills ] return f""" Nouvelle(s) facture(s)

    Vous avez reçu {len(bills)} nouvelle(s) facture(s)

    """ except Exception as e: logger.exception("Erreur dans construct_html", e) return "" def send_email( subject, content, email_from, email_password, smtp_mail_address, smpt_port, email_to, on_error=None, ): try: msg = MIMEMultipart() msg["From"] = _as_header(email_from) msg["To"] = _as_header(email_to) msg["Subject"] = _as_header(subject) msg.attach(MIMEText(str(content), "html")) rcpts = _as_rcpt_list(email_to) with smtplib.SMTP(smtp_mail_address, smpt_port) as server: server.starttls() server.login(str(email_from), str(email_password)) server.sendmail(str(email_from), rcpts, msg.as_string()) except Exception as e: logger.exception("Erreur dans send_email") if on_error: on_error(e)