from django.core.mail import send_mail, get_connection, EmailMultiAlternatives, EmailMessage from django.template.loader import render_to_string from django.utils.html import strip_tags from django.conf import settings import re from rest_framework.response import Response from rest_framework import status from rest_framework.exceptions import NotFound from Settings.models import MailSettings from Establishment.models import Establishment # Importer le modèle Establishment def getConnection(id_establishement): try: # Récupérer l'instance de l'établissement establishment = Establishment.objects.get(id=id_establishement) # Récupérer les paramètres SMTP associés à l'établissement 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.mail_user, password=smtp_settings.mail_password, use_tls=smtp_settings.use_tls, use_ssl=smtp_settings.use_ssl ) return connection except Establishment.DoesNotExist: raise NotFound(f"Aucun établissement trouvé avec l'ID {id_establishement}") except MailSettings.DoesNotExist: raise NotFound(f"Aucun paramètre SMTP trouvé pour l'établissement {id_establishement}") def sendMail(subject, message, recipients, cc=[], bcc=[], attachments=[], connection=None): try: plain_message = strip_tags(message) from_email = settings.EMAIL_HOST_USER if connection is not None: from_email = connection.username email = EmailMultiAlternatives( subject=subject, body=plain_message, from_email=from_email, to=recipients, cc=cc, bcc=bcc, connection=connection ) email.attach_alternative(message, "text/html") # Ajout des pièces jointes for attachment in attachments: # attachment doit être un tuple (filename, content, mimetype) # ex: ("document.pdf", fichier.read(), "application/pdf") email.attach(*attachment) email.send(fail_silently=False) return Response({'message': 'Email envoyé avec succès.'}, status=status.HTTP_200_OK) except Exception as e: return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) def envoieReinitMotDePasse(recipients, code): errorMessage = '' try: EMAIL_REINIT_SUBJECT = 'Réinitialisation du mot de passe' context = { 'BASE_URL': settings.BASE_URL, 'code': str(code) } subject = EMAIL_REINIT_SUBJECT html_message = render_to_string('emails/resetPassword.html', context) sendMail(subject, html_message, recipients) except Exception as e: errorMessage = str(e) return errorMessage def sendRegisterForm(recipients, establishment_id): errorMessage = '' try: # Préparation du contexte pour le template EMAIL_INSCRIPTION_SUBJECT = '[N3WT-SCHOOL] Dossier Inscription' context = { 'BASE_URL': settings.BASE_URL, 'email': recipients, 'establishment': establishment_id } subject = EMAIL_INSCRIPTION_SUBJECT html_message = render_to_string('emails/inscription.html', context) sendMail(subject, html_message, recipients) except Exception as e: errorMessage = str(e) return errorMessage def sendMandatSEPA(recipients, establishment_id): errorMessage = '' try: # Préparation du contexte pour le template EMAIL_INSCRIPTION_SUBJECT = '[N3WT-SCHOOL] Mandat de prélèvement SEPA' context = { 'BASE_URL': settings.BASE_URL, 'email': recipients, 'establishment': establishment_id } subject = EMAIL_INSCRIPTION_SUBJECT html_message = render_to_string('emails/sepa.html', context) sendMail(subject, html_message, recipients) except Exception as e: errorMessage = str(e) return errorMessage def envoieRelanceDossierInscription(recipients, code): EMAIL_RELANCE_SUBJECT = '[N3WT-SCHOOL] Relance - Dossier Inscription' EMAIL_RELANCE_CORPUS = 'Bonjour,\nN\'ayant pas eu de retour de votre part, nous vous renvoyons le lien vers le formulaire d\'inscription : ' + BASE_URL + '/users/login\nCordialement' errorMessage = '' try: sendMail(EMAIL_RELANCE_SUBJECT, EMAIL_RELANCE_CORPUS%str(code), recipients) except Exception as e: errorMessage = str(e) return errorMessage def isValid(message, fiche_inscription): # Est-ce que la référence du dossier est VALIDATED subject = message.subject print ("++++ " + subject) responsableMail = message.from_header result = re.search('<(.*)>', responsableMail) if result: responsableMail = result.group(1) result = re.search(r'.*\[Ref(.*)\].*', subject) idMail = -1 if result: idMail = result.group(1).strip() eleve = fiche_inscription.eleve responsable = eleve.getMainGuardian() mailReponsableAVerifier = responsable.mail 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