Bonjour,
J'ai créé ce sujet pour discuter d'une fonctionnalité que j'aimerais voir apparaître sur la plateforme, c'est la possibilité de répondre par email aux notifications. Par exemple, je reçois par email, une notification de l'ajout d'un message sur un sujet. La nouvelle fonctionnalité permettrait si je répond à ce mail de poster directement ma réponse dans le sujet. Pour une explication plus détaillé, je vous renvois sur la documentation GitHub, qui est un outil qui à la même fonctionnalité.
Le message est découpé en deux parties, la partie technique et la partie fonctionnelle. Vous pouvez donner votre avis sur la partie fonctionnelle en omettant la partie technique.
Discution technique
J'ai trouvé une astuce pour avoir la fonctionnalité sans avoir à installer un serveur de mail sur le serveur zeste de savoir.
Le système pour fonctionner a besoin de deux nouvelles librairies (compatible toutes deux python 3): django-mailbox et Email Reply Parser. Je vous rassure, y'a juste à remplir 3 champs d'un formulaire dans l'administration django pour faire marcher la fonctionnalité.
Comment ça marche pour répondre à une notification sur un sujet du forum?:
-
à l'envois de la notification, on ajoute dans l’entête du mail, un champ 'Reply-to', dans ce champ, une adresse email composé comme ceci: noreplyzestedesavoir+<id du sujet du forum>-reponsesujet-<token de securité>@gmail.com. Le token est là pour la sécurité mais aussi pour lié l'utilisateur. Avant d'envoyer, le mail, il est bien sur obligatoire d'enregistrer le token dans la base de données et de le lier avec l'utilisateur.
-
à la réception, l'utilisateur clique sur le bouton 'répondre', son client mail, utilise le champ, 'Reply-to' pour remplir l'adresse du destinataire. L'utilisateur écrit la réponse qu'il souhaite dans le message et clique sur envoyer.
-
Les serveurs de Gmail à la réception du mail, traite le mail et envois à l'adresse noreplyzestedesavoir@gmail.com.
-
django-mailbox périodiquement, relève les mails de l'adresse noreplyzestedesavoir@gmail.com. Dans le code, c'est juste ajouter une nouvelle annotation sur une méthode. Dans cette méthode, on traite le mail en récupérant le token et l'id. Grâce à la librairie, Email Reply Parser on peut récupérer la réponse à ajouter dans le forum.
Au niveau du code, ça donne un truc comme ça :
1 2 3 4 5 6 7 | # Génération du token + enregistrement dans la base ... # Envois du mail msg = EmailMultiAlternatives(subject, message_txt, from_email, [email_destinataire], headers={'Reply-To': 'noreplyzestedesavoir+' + str(n_topic.id) + '-reponsesujet-' + token}). |
dans le setting.py,
1 2 | INSTALLED_APPS += ( 'django_mailbox') |
dans le model.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @receiver(message_received) def get_new_mail(sender, message, **args): for address in message.to_header.split(','): if address: m = re.search('noreplyzestedesavoir+(.+?)-(.+?)-(.+?)@gmail.com', address) if m: if m.group(2) == '-reponsesujet': id_topic = m.group(1)[1:] token = m.group(3) response = EmailReplyParser.read(message.text).fragments[0].content topic = get_object_or_404(PrivateTopic, pk=(int(id_topic))) send_message_forum(topic, response) |
Installation
L'installation des deux dépendances peuvent être mise dans le requirements.txt. Il faut configurer django-mailbox , la doc est trés bien faite, c'est juste remplir trois champs dans l'admin django. L'autre lib s'utilise sans configuration.
Discution fonctionnelle
Pour qu'il puisse répondre par mail, il faut que l'utilisateur possède l'historique du sujet par mail. Le premier souci est quand le sujet génère plusieurs dizaines de messages. Il va donc être obligé de recevoir dix messages avec à chaque fois ce que les autres ont posté.
Le deuxième souci est la confidentialité, quand le sujet est publique aucun souci mais pour les MP, c'est une autre histoire. On est obligé de faire passer le(s) dernier(s) message(s) par mail. On ne peut garantir la sécurité des échanges par mail facilement (Analyse du mail par le gouvernement, NSA puis par les serveurs de mail, plus les FAI). La question doit t-on se limiter aux contenus publique: réponse aux tutoriels, articles pour l'auteur et pour les forums ?
Votre avis ?
Pour ceux qui ont envie de lire: