import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import os from dotenv import load_dotenv from typing import Optional from utils.logging_utils import log_to_file # remplace "import logging" car maintenat les logging sont définis et importés depuis le fichier dédié: logging_utils.py load_dotenv() # Configuration email EMAIL_HOST = os.getenv("EMAIL_HOST", "smtp.gmail.com") EMAIL_PORT = int(os.getenv("EMAIL_PORT", "587")) EMAIL_HOST_USER = os.getenv("EMAIL_HOST_USER") EMAIL_HOST_USER_PASSWORD = os.getenv("EMAIL_HOST_USER_PASSWORD") DEFAULT_FROM_EMAIL = os.getenv("DEFAULT_FROM_EMAIL") """ Le fichier email_utils.py est responsable de l'envoi de tous les emails dans l'application, notamment : Les emails de vérification lors de l'inscription d'un nouvel utilisateur Les emails de réinitialisation de mot de passe quand un utilisateur clique sur "Mot de passe oublié" Les emails de notification (activité du compte, changements de permission, etc.) Pour tester les modifications : Essayez de créer un nouveau compte (pour tester l'email de vérification) Ou cliquez sur "Mot de passe oublié" sur la page de connexion """ # Configuration du logging #logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') # Tentative de chargement du .env env_path = '.env' if os.path.exists(env_path): load_dotenv(env_path) log_to_file(f"Fichier .env trouvé et chargé") # Afficher les variables pour vérification log_to_file(f"EMAIL_HOST: {os.getenv('EMAIL_HOST')}") log_to_file(f"EMAIL_PORT: {os.getenv('EMAIL_PORT')}") log_to_file(f"EMAIL_HOST_USER: {os.getenv('EMAIL_HOST_USER')}") log_to_file(f"DEFAULT_FROM_EMAIL: {os.getenv('DEFAULT_FROM_EMAIL')}") # Ne pas logger le mot de passe pour des raisons de sécurité else: log_to_file(f"Fichier .env non trouvé à l'emplacement: {os.path.abspath(env_path)}") def create_smtp_connection() -> Optional[smtplib.SMTP]: """ Crée et retourne une connexion SMTP sécurisée. """ try: server = smtplib.SMTP(EMAIL_HOST, EMAIL_PORT) server.ehlo() # Identifier le client au serveur server.starttls() # Activer le chiffrement TLS server.login(EMAIL_HOST_USER, EMAIL_HOST_USER_PASSWORD) return server except Exception as e: log_to_file(f"Erreur lors de la connexion SMTP : {str(e)}") return None def send_email(to_email: str, subject: str, html_content: str) -> bool: """ Envoie un email avec un contenu HTML. """ if not all([EMAIL_HOST_USER, EMAIL_HOST_USER_PASSWORD, DEFAULT_FROM_EMAIL]): log_to_file("Configuration email manquante dans le fichier .env") return False try: # Création du message msg = MIMEMultipart('alternative') msg['Subject'] = subject msg['From'] = DEFAULT_FROM_EMAIL msg['To'] = to_email # Ajout du contenu HTML html_part = MIMEText(html_content, 'html') msg.attach(html_part) # Création de la connexion SMTP et envoi server = create_smtp_connection() if not server: return False try: server.send_message(msg) log_to_file(f"Email envoyé avec succès à {to_email}") return True except Exception as e: log_to_file(f"Erreur lors de l'envoi de l'email : {str(e)}") return False finally: try: server.quit() except: pass except Exception as e: log_to_file(f"Erreur lors de la préparation de l'email : {str(e)}") return False