MultiCountryRAG / core /email_tool.py
SAAHMATHWORKS
fix sys path
3e14b58
# acfai_project/core/email_tool.py
# Add this as the FIRST lines of code (after docstrings)
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent))
import os
import smtplib
import logging
from email.mime.text import MIMEText # Correction: MIMEText au lieu de MimeText
from email.mime.multipart import MIMEMultipart # Correction: MIMEMultipart au lieu de MimeMultipart
from typing import Dict, Optional
import re
import datetime # Ajout pour la date
from config.settings import settings
logger = logging.getLogger(__name__)
class LegalAssistanceEmailer:
def __init__(self):
self.email_address = os.getenv("EMAIL_ADDRESS")
self.email_password = os.getenv("EMAIL_APP_PASSWORD")
self.lawyer_email = os.getenv("LAWYER_EMAIL", "fitahiana@acfai.org")
self.smtp_server = "smtp.gmail.com"
self.smtp_port = 587
def is_assistance_request(self, query: str) -> bool:
"""Détecte si l'utilisateur demande une assistance humaine"""
assistance_keywords = [
"parler à un avocat", "avocat humain", "assistance humaine",
"contactez-moi", "rappelez-moi", "assistance téléphonique",
"besoin d'un avocat", "consultation juridique", "avocat réel",
"aide humaine", "contact humain", "échange avec un avocat",
"assisté", "assisté par", "être assisté"
]
query_lower = query.lower()
return any(keyword in query_lower for keyword in assistance_keywords)
def extract_email_from_text(self, text: str) -> Optional[str]:
"""Extrait un email d'un texte"""
email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
matches = re.findall(email_pattern, text)
return matches[0] if matches else None
def validate_email(self, email: str) -> bool:
"""Valide le format d'un email"""
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
return re.match(pattern, email) is not None
def send_assistance_request(self, user_email: str, user_query: str,
assistance_description: str, country: str) -> Dict[str, any]:
"""Envoie les emails de confirmation à l'utilisateur et à l'avocat"""
try:
# Validation des emails
if not self.validate_email(user_email):
return {"success": False, "error": "Format d'email utilisateur invalide"}
if not self.validate_email(self.lawyer_email):
return {"success": False, "error": "Format d'email avocat invalide"}
# Connexion SMTP
server = smtplib.SMTP(self.smtp_server, self.smtp_port)
server.starttls()
server.login(self.email_address, self.email_password)
# Email à l'utilisateur
user_email_sent = self._send_user_confirmation(server, user_email, user_query, country)
# Email à l'avocat
lawyer_email_sent = self._send_lawyer_notification(server, user_email, user_query,
assistance_description, country)
server.quit()
if user_email_sent and lawyer_email_sent:
logger.info(f"✅ Emails envoyés avec succès pour {user_email}")
return {
"success": True,
"message": "Demande d'assistance envoyée avec succès",
"user_email": user_email,
"lawyer_email": self.lawyer_email
}
else:
return {"success": False, "error": "Échec de l'envoi des emails"}
except Exception as e:
logger.error(f"❌ Erreur d'envoi d'email: {e}")
return {"success": False, "error": f"Erreur SMTP: {str(e)}"}
def _send_user_confirmation(self, server, user_email: str, user_query: str, country: str) -> bool:
"""Envoie l'email de confirmation à l'utilisateur"""
try:
message = MIMEMultipart() # Correction: MIMEMultipart
message["From"] = self.email_address
message["To"] = user_email
message["Subject"] = "📧 Confirmation de votre demande d'assistance juridique"
body = f"""
<html>
<body>
<h2 style="color: #2E86AB;">Confirmation de votre demande d'assistance juridique</h2>
<p>Bonjour,</p>
<p>Nous accusons réception de votre demande d'assistance juridique concernant :</p>
<div style="background-color: #f8f9fa; padding: 15px; border-left: 4px solid #2E86AB;">
<strong>Question initiale :</strong> {user_query}<br>
<strong>Juridiction concernée :</strong> {country}<br>
<strong>Votre email :</strong> {user_email}
</div>
<p>✅ <strong>Notre équipe juridique a été notifiée</strong> et vous contactera dans les plus brefs délais.</p>
<h3>📞 Prochaines étapes :</h3>
<ul>
<li>Un avocat spécialisé vous contactera à l'adresse {user_email}</li>
<li>Préparez les documents relatifs à votre situation</li>
<li>Durée de réponse estimée : 24-48 heures</li>
</ul>
<p>Pour toute urgence, vous pouvez répondre directement à cet email.</p>
<hr>
<p style="color: #6c757d;">
<small>
ACFAI - Assistance Juridique Intelligente<br>
Email : {self.lawyer_email}<br>
Ceci est un message automatique, merci de ne pas y répondre directement.
</small>
</p>
</body>
</html>
"""
message.attach(MIMEText(body, "html")) # Correction: MIMEText
server.send_message(message)
return True
except Exception as e:
logger.error(f"Erreur envoi email utilisateur: {e}")
return False
def _send_lawyer_notification(self, server, user_email: str, user_query: str,
assistance_description: str, country: str) -> bool:
"""Envoie la notification à l'avocat"""
try:
message = MIMEMultipart() # Correction: MIMEMultipart
message["From"] = self.email_address
message["To"] = self.lawyer_email
message["Subject"] = f"🔔 Nouvelle demande d'assistance juridique - {country}"
body = f"""
<html>
<body>
<h2 style="color: #A23B72;">Nouvelle demande d'assistance juridique</h2>
<div style="background-color: #fff3cd; padding: 15px; border-left: 4px solid #ffc107;">
<h3>📋 Informations de la demande :</h3>
<p><strong>Utilisateur :</strong> {user_email}</p>
<p><strong>Pays/Juridiction :</strong> {country}</p>
<p><strong>Question initiale :</strong> {user_query}</p>
<p><strong>Description de l'assistance demandée :</strong><br>{assistance_description}</p>
</div>
<h3>🚀 Action requise :</h3>
<ul>
<li>Contacter l'utilisateur à : {user_email}</li>
<li>Spécialité requise : Droit {country}</li>
<li>Priorité : Normale</li>
</ul>
<hr>
<p style="color: #6c757d;">
<small>
Système Automatique ACFAI - {settings.CHAT_MODEL}<br>
Généré le : {datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}
</small>
</p>
</body>
</html>
"""
message.attach(MIMEText(body, "html")) # Correction: MIMEText
server.send_message(message)
return True
except Exception as e:
logger.error(f"Erreur envoi email avocat: {e}")
return False