202 lines
8.3 KiB
Python
202 lines
8.3 KiB
Python
import smtplib
|
|
from email.mime.multipart import MIMEMultipart
|
|
from email.mime.text import MIMEText
|
|
from config.config import settings
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class AuthEmailService:
|
|
@staticmethod
|
|
def _send_email(to: str, subject: str, html_body: str) -> bool:
|
|
try:
|
|
msg = MIMEMultipart()
|
|
msg["From"] = settings.smtp_from
|
|
msg["To"] = to
|
|
msg["Subject"] = subject
|
|
|
|
msg.attach(MIMEText(html_body, "html"))
|
|
|
|
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.send_message(msg)
|
|
|
|
logger.info(f" Email envoyé: {subject} → {to}")
|
|
return True
|
|
|
|
except Exception as e:
|
|
logger.error(f" Erreur envoi email: {e}")
|
|
return False
|
|
|
|
@staticmethod
|
|
def send_verification_email(email: str, token: str, base_url: str) -> bool:
|
|
verification_link = f"{base_url}/auth/verify-email?token={token}"
|
|
|
|
html_body = f"""
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<style>
|
|
body {{ font-family: Arial, sans-serif; line-height: 1.6; color: #333; }}
|
|
.container {{ max-width: 600px; margin: 0 auto; padding: 20px; }}
|
|
.header {{ background: #4F46E5; color: white; padding: 20px; text-align: center; border-radius: 8px 8px 0 0; }}
|
|
.content {{ background: #f9fafb; padding: 30px; border-radius: 0 0 8px 8px; }}
|
|
.button {{
|
|
display: inline-block;
|
|
background: #4F46E5;
|
|
color: white;
|
|
padding: 12px 30px;
|
|
text-decoration: none;
|
|
border-radius: 6px;
|
|
margin: 20px 0;
|
|
}}
|
|
.footer {{ text-align: center; margin-top: 20px; font-size: 12px; color: #6b7280; }}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
<div class="header">
|
|
<h1>🎉 Bienvenue sur Sage Dataven</h1>
|
|
</div>
|
|
<div class="content">
|
|
<h2>Vérifiez votre adresse email</h2>
|
|
<p>Merci de vous être inscrit ! Pour activer votre compte, veuillez cliquer sur le bouton ci-dessous :</p>
|
|
|
|
<div style="text-align: center;">
|
|
<a href="{verification_link}" class="button">Vérifier mon email</a>
|
|
</div>
|
|
|
|
<p style="margin-top: 30px;">Ou copiez ce lien dans votre navigateur :</p>
|
|
<p style="word-break: break-all; background: #e5e7eb; padding: 10px; border-radius: 4px;">
|
|
{verification_link}
|
|
</p>
|
|
|
|
<p style="margin-top: 30px; color: #ef4444;">
|
|
Ce lien expire dans <strong>24 heures</strong>
|
|
</p>
|
|
|
|
<p style="margin-top: 30px; font-size: 14px; color: #6b7280;">
|
|
Si vous n'avez pas créé de compte, ignorez cet email.
|
|
</p>
|
|
</div>
|
|
<div class="footer">
|
|
<p>© 2024 Sage Dataven - API de gestion commerciale</p>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
"""
|
|
|
|
return AuthEmailService._send_email(
|
|
email, " Vérifiez votre adresse email - Sage Dataven", html_body
|
|
)
|
|
|
|
@staticmethod
|
|
def send_password_reset_email(email: str, token: str, base_url: str) -> bool:
|
|
reset_link = f"{base_url}/reset?token={token}"
|
|
|
|
html_body = f"""
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<style>
|
|
body {{ font-family: Arial, sans-serif; line-height: 1.6; color: #333; }}
|
|
.container {{ max-width: 600px; margin: 0 auto; padding: 20px; }}
|
|
.header {{ background: #EF4444; color: white; padding: 20px; text-align: center; border-radius: 8px 8px 0 0; }}
|
|
.content {{ background: #f9fafb; padding: 30px; border-radius: 0 0 8px 8px; }}
|
|
.button {{
|
|
display: inline-block;
|
|
background: #EF4444;
|
|
color: white;
|
|
padding: 12px 30px;
|
|
text-decoration: none;
|
|
border-radius: 6px;
|
|
margin: 20px 0;
|
|
}}
|
|
.footer {{ text-align: center; margin-top: 20px; font-size: 12px; color: #6b7280; }}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
<div class="header">
|
|
<h1> Réinitialisation de mot de passe</h1>
|
|
</div>
|
|
<div class="content">
|
|
<h2>Demande de réinitialisation</h2>
|
|
<p>Vous avez demandé à réinitialiser votre mot de passe. Cliquez sur le bouton ci-dessous pour créer un nouveau mot de passe :</p>
|
|
|
|
<div style="text-align: center;">
|
|
<a href="{reset_link}" class="button">Réinitialiser mon mot de passe</a>
|
|
</div>
|
|
|
|
<p style="margin-top: 30px;">Ou copiez ce lien dans votre navigateur :</p>
|
|
<p style="word-break: break-all; background: #e5e7eb; padding: 10px; border-radius: 4px;">
|
|
{reset_link}
|
|
</p>
|
|
|
|
<p style="margin-top: 30px; color: #ef4444;">
|
|
Ce lien expire dans <strong>1 heure</strong>
|
|
</p>
|
|
|
|
<p style="margin-top: 30px; font-size: 14px; color: #6b7280;">
|
|
Si vous n'avez pas demandé cette réinitialisation, ignorez cet email. Votre mot de passe actuel reste inchangé.
|
|
</p>
|
|
</div>
|
|
<div class="footer">
|
|
<p>© 2024 Sage Dataven - API de gestion commerciale</p>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
"""
|
|
|
|
return AuthEmailService._send_email(
|
|
email, " Réinitialisation de votre mot de passe - Sage Dataven", html_body
|
|
)
|
|
|
|
@staticmethod
|
|
def send_password_changed_notification(email: str) -> bool:
|
|
html_body = """
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<style>
|
|
body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
|
|
.container { max-width: 600px; margin: 0 auto; padding: 20px; }
|
|
.header { background: #10B981; color: white; padding: 20px; text-align: center; border-radius: 8px 8px 0 0; }
|
|
.content { background: #f9fafb; padding: 30px; border-radius: 0 0 8px 8px; }
|
|
.footer { text-align: center; margin-top: 20px; font-size: 12px; color: #6b7280; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
<div class="header">
|
|
<h1> Mot de passe modifié</h1>
|
|
</div>
|
|
<div class="content">
|
|
<h2>Votre mot de passe a été changé avec succès</h2>
|
|
<p>Ce message confirme que le mot de passe de votre compte Sage Dataven a été modifié.</p>
|
|
|
|
<p style="margin-top: 30px; padding: 15px; background: #FEF3C7; border-left: 4px solid #F59E0B; border-radius: 4px;">
|
|
Si vous n'êtes pas à l'origine de ce changement, contactez immédiatement notre support.
|
|
</p>
|
|
</div>
|
|
<div class="footer">
|
|
<p>© 2024 Sage Dataven - API de gestion commerciale</p>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
"""
|
|
|
|
return AuthEmailService._send_email(
|
|
email, " Votre mot de passe a été modifié - Sage Dataven", html_body
|
|
)
|