Spaces:
Sleeping
Sleeping
File size: 8,602 Bytes
fbdfc24 3e14b58 fbdfc24 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
# 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 |