import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from typing import Optional, List import logging from config.config import settings logger = logging.getLogger(__name__) class AuthEmailService: @staticmethod def _send_email( to: str, subject: str, html_body: str, cc: Optional[List[str]] = None, bcc: Optional[List[str]] = None, ) -> bool: try: msg = MIMEMultipart("alternative") msg["From"] = settings.smtp_from msg["To"] = to msg["Subject"] = subject if cc: msg["Cc"] = ", ".join(cc) msg.attach(MIMEText(html_body, "html", "utf-8")) recipients = [to] if cc: recipients.extend(cc) if bcc: recipients.extend(bcc) with smtplib.SMTP( settings.smtp_host, settings.smtp_port, timeout=30 ) as server: if settings.smtp_use_tls: server.starttls() if settings.smtp_user and settings.smtp_password: server.login(settings.smtp_user, settings.smtp_password) server.sendmail(settings.smtp_from, recipients, msg.as_string()) logger.info(f"Email envoye: {subject} vers {to}") return True except smtplib.SMTPException as e: logger.error(f"Erreur SMTP envoi email: {e}") return False except Exception as e: logger.error(f"Erreur envoi email: {e}") return False @classmethod def send_verification_email(cls, email: str, token: str, base_url: str) -> bool: verification_link = f"{base_url}/auth/verify-email?token={token}" html_body = f""" Verification de votre email

Verification de votre email

Bienvenue sur Sage Dataven. Pour activer votre compte, veuillez verifier votre adresse email en cliquant sur le bouton ci-dessous.

Verifier mon email

Si le bouton ne fonctionne pas, copiez ce lien dans votre navigateur :

{verification_link}

Ce lien expire dans 24 heures.

Si vous n'avez pas cree de compte, ignorez cet email.

""" return cls._send_email( email, "Verifiez votre adresse email - Sage Dataven", html_body ) @classmethod def send_password_reset_email( cls, email: str, token: str, frontend_url: str ) -> bool: reset_link = f"{frontend_url}/reset-password?token={token}" html_body = f""" Reinitialisation de mot de passe

Reinitialisation du mot de passe

Vous avez demande la reinitialisation de votre mot de passe. Cliquez sur le bouton ci-dessous pour creer un nouveau mot de passe.

Reinitialiser mon mot de passe

Si le bouton ne fonctionne pas, copiez ce lien :

{reset_link}

Ce lien expire dans 1 heure.

Si vous n'avez pas demande cette reinitialisation, ignorez cet email. Votre mot de passe restera inchange.

""" return cls._send_email( email, "Reinitialisation de votre mot de passe - Sage Dataven", html_body ) @classmethod def send_password_changed_notification(cls, email: str) -> bool: html_body = """ Mot de passe modifie

Mot de passe modifie

Votre mot de passe a ete modifie avec succes.

Si vous n'etes pas a l'origine de ce changement, contactez immediatement notre support.

Securite : Toutes vos sessions actives ont ete deconnectees. Vous devrez vous reconnecter sur tous vos appareils.

Sage Dataven - Notification de securite

""" return cls._send_email( email, "Votre mot de passe a ete modifie - Sage Dataven", html_body ) @classmethod def send_security_alert( cls, email: str, alert_type: str, details: str, ip_address: Optional[str] = None ) -> bool: ip_info = ( f"

Adresse IP : {ip_address}

" if ip_address else "" ) html_body = f""" Alerte de securite

Alerte de securite

{alert_type}

{details}

{ip_info}

Si vous reconnaissez cette activite, vous pouvez ignorer ce message. Sinon, nous vous recommandons de changer votre mot de passe immediatement.

Sage Dataven - Alerte de securite automatique

""" return cls._send_email( email, f"Alerte de securite : {alert_type} - Sage Dataven", html_body )