colibri.assistant.ai / utils /email_utils.py
Gouzi Mohaled
Ajoute des fichiers et sous-dossiers supplémentaires
fe4792e
raw
history blame
3.7 kB
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