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.
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.
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
)