mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-01-29 07:53:23 +00:00
chore: Synchronisation IMAP
This commit is contained in:
@ -6,7 +6,7 @@ import re
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import status
|
||||
from rest_framework.exceptions import NotFound
|
||||
from Settings.models import SMTPSettings
|
||||
from Settings.models import MailSettings
|
||||
from Establishment.models import Establishment # Importer le modèle Establishment
|
||||
|
||||
def getConnection(id_establishement):
|
||||
@ -15,14 +15,14 @@ def getConnection(id_establishement):
|
||||
establishment = Establishment.objects.get(id=id_establishement)
|
||||
|
||||
# Récupérer les paramètres SMTP associés à l'établissement
|
||||
smtp_settings = SMTPSettings.objects.get(establishment=establishment)
|
||||
smtp_settings = MailSettings.objects.get(establishment=establishment)
|
||||
|
||||
# Créer une connexion SMTP avec les paramètres récupérés
|
||||
connection = get_connection(
|
||||
host=smtp_settings.smtp_server,
|
||||
port=smtp_settings.smtp_port,
|
||||
username=smtp_settings.smtp_user,
|
||||
password=smtp_settings.smtp_password,
|
||||
username=smtp_settings.mail_user,
|
||||
password=smtp_settings.mail_password,
|
||||
use_tls=smtp_settings.use_tls,
|
||||
use_ssl=smtp_settings.use_ssl
|
||||
)
|
||||
@ -30,7 +30,7 @@ def getConnection(id_establishement):
|
||||
|
||||
except Establishment.DoesNotExist:
|
||||
raise NotFound(f"Aucun établissement trouvé avec l'ID {id_establishement}")
|
||||
except SMTPSettings.DoesNotExist:
|
||||
except MailSettings.DoesNotExist:
|
||||
raise NotFound(f"Aucun paramètre SMTP trouvé pour l'établissement {id_establishement}")
|
||||
|
||||
|
||||
@ -153,4 +153,25 @@ def isValid(message, fiche_inscription):
|
||||
responsable = eleve.getMainGuardian()
|
||||
mailReponsableAVerifier = responsable.mail
|
||||
|
||||
return responsableMail == mailReponsableAVerifier and str(idMail) == str(fiche_inscription.eleve.id)
|
||||
return responsableMail == mailReponsableAVerifier and str(idMail) == str(fiche_inscription.eleve.id)
|
||||
|
||||
def test_mailbox_uri(uri):
|
||||
"""
|
||||
Teste la validité d'une URI IMAP en tentant une connexion réelle.
|
||||
Retourne True si la connexion réussit, False sinon.
|
||||
"""
|
||||
from django_mailbox.models import Mailbox
|
||||
try:
|
||||
mailbox = Mailbox(uri=uri)
|
||||
conn = mailbox.get_connection()
|
||||
# Essaye de récupérer un message (ou juste la connexion)
|
||||
# Pour IMAP, get_message() va ouvrir et fermer la connexion
|
||||
try:
|
||||
next(conn.get_message())
|
||||
except StopIteration:
|
||||
# Aucun message, mais connexion OK
|
||||
pass
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"Erreur de connexion IMAP : {e}")
|
||||
return False
|
||||
@ -62,7 +62,8 @@ INSTALLED_APPS = [
|
||||
'django_celery_beat',
|
||||
'N3wtSchool',
|
||||
'drf_yasg',
|
||||
'rest_framework_simplejwt'
|
||||
'rest_framework_simplejwt',
|
||||
'django_mailbox',
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
@ -166,6 +167,16 @@ LOGGING = {
|
||||
"level": os.getenv("GESTION_ENSEIGNANTS_LOG_LEVEL", "INFO"),
|
||||
"propagate": False,
|
||||
},
|
||||
"django_mailbox": {
|
||||
"handlers": ["console"],
|
||||
"level": "DEBUG",
|
||||
"propagate": False,
|
||||
},
|
||||
"django_mailbox.models": {
|
||||
"handlers": ["console"],
|
||||
"level": "DEBUG",
|
||||
"propagate": False,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -14,8 +14,9 @@ def setup_periodic_tasks(sender, **kwargs):
|
||||
|
||||
# Déclarer la tâche périodique
|
||||
PeriodicTask.objects.get_or_create(
|
||||
interval=schedule, # Utiliser l'intervalle défini ci-dessus
|
||||
name='Tâche périodique toutes les 5 secondes',
|
||||
task='Subscriptions.tasks.check_for_signature_deadlines', # Remplacer par le nom de ta tâche
|
||||
kwargs=json.dumps({}) # Si nécessaire, ajoute
|
||||
interval=schedule,
|
||||
name='getMail',
|
||||
task='N3wtSchool.tasks.run_getmail',
|
||||
kwargs=json.dumps({}),
|
||||
defaults={"enabled": False}
|
||||
)
|
||||
33
Back-End/N3wtSchool/tasks.py
Normal file
33
Back-End/N3wtSchool/tasks.py
Normal file
@ -0,0 +1,33 @@
|
||||
from celery import shared_task
|
||||
from django_mailbox.models import Message, Mailbox
|
||||
from django_celery_beat.models import PeriodicTask
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger("django_mailbox")
|
||||
|
||||
@shared_task
|
||||
def run_getmail():
|
||||
"""
|
||||
Tâche périodique pour lancer l'import IMAP sur toutes les mailboxes actives
|
||||
et traiter les nouveaux messages interceptés selon des critères.
|
||||
"""
|
||||
logger.info("Début import IMAP")
|
||||
|
||||
for mailbox in Mailbox.objects.filter(active=True):
|
||||
messages = mailbox.get_new_mail()
|
||||
try:
|
||||
for message in messages:
|
||||
logger.info(f"[IMAP] Tentative d'import : {message.subject} de {message.from_address}")
|
||||
# Filtrage sur le sujet et l'émetteur
|
||||
if (
|
||||
message.subject == "n3wt"
|
||||
and message.from_address == "anthony.casini.30@gmail.com"
|
||||
):
|
||||
logger.info(f"[IMAP] Message importé : {message.subject} de {message.from_address}")
|
||||
else:
|
||||
# Optionnel : supprimer le message importé qui ne correspond pas
|
||||
message.delete()
|
||||
except Exception as e:
|
||||
logger.error(f"Erreur lors de l'import des messages pour la mailbox {mailbox}: {e}", exc_info=True)
|
||||
|
||||
logger.info("Fin import IMAP")
|
||||
Reference in New Issue
Block a user