Development #48133
SMTPRecipientsRefused: {'blabla&@gmail.com': (550, b'restricted characters in address')}
0%
Description
https://sentry.entrouvert.org/entrouvert/publik/issues/5862/
SMTPRecipientsRefused: {'cabinetdentaire06&@gmail.com': (550, b'restricted characters in address')} ... File "authentic2/cbv.py", line 38, in dispatch return super(ValidateCSRFMixin, self).dispatch(*args, **kwargs) File "authentic2/views.py", line 815, in dispatch return super(BaseRegistrationView, self).dispatch(request, *args, **kwargs) File "django/views/generic/base.py", line 88, in dispatch return handler(request, *args, **kwargs) File "django/views/generic/edit.py", line 183, in post return self.form_valid(form) File "authentic2/cbv.py", line 46, in form_valid return super(ValidateCSRFMixin, self).form_valid(*args, **kwargs) File "authentic2/views.py", line 864, in form_valid ou=self.ou, **self.token) File "authentic2/utils/__init__.py", line 757, in send_registration_mail legacy_html_body_templates=['registration/activation_email.html']) File "authentic2/utils/__init__.py", line 666, in send_templated_mail html_message=html_body, **kwargs) File "django/core/mail/__init__.py", line 62, in send_mail return mail.send() File "django/core/mail/message.py", line 348, in send return self.get_connection(fail_silently).send_messages([self]) File "django/core/mail/backends/smtp.py", line 111, in send_messages sent = self._send(message) File "django/core/mail/backends/smtp.py", line 127, in _send self.connection.sendmail(from_email, recipients, message.as_bytes(linesep='\r\n')) File "smtplib.py", line 881, in sendmail raise SMTPRecipientsRefused(senderrs)
Une adresse avec un & dans la partie locale est acceptée mais ça foire quand c'est passé au SMTP.
Fichiers
Révisions associées
Historique
Mis à jour par Frédéric Péters il y a plus de 3 ans
- Projet changé de Suivi des traces à Authentic 2
Mis à jour par Benjamin Dauvergne il y a plus de 3 ans
Une rapide recherche me laisse à penser que bien que ce soit très peu commun, voir ici certainement une erreur, c'est parfaitement valide et exim4 serait un peu trop tatillon.
Est-ce qu'on vise surtout le fait de bien remonter l'erreur SMTP jusqu'à l'utilisateur sans tracer ou autre chose (et dans ce cas là ce serait plutôt un ticket sysadmin) ?
Mis à jour par Frédéric Péters il y a plus de 3 ans
Ma position c'est que bien que légal d'un point de vue RFC, ça va dans 100% des cas être une typo et qu'il faudrait remonter à l'usager qu'il s'est trompé.
Mis à jour par Benjamin Dauvergne il y a plus de 3 ans
Frédéric Péters a écrit :
Ma position c'est que bien que légal d'un point de vue RFC, ça va dans 100% des cas être une typo et qu'il faudrait remonter à l'usager qu'il s'est trompé.
Bon ce serait plus simple de décider de ce qu'on accepte, ^[a-zA-Z0-9.+]+$
pour la partie user ?
Mis à jour par Frédéric Péters il y a plus de 3 ans
Regarder ce qu'exim accepte ?
# The second rule applies to all other domains, and its default is # considerably less strict. # The default value of CHECK_RCPT_REMOTE_LOCALPARTS is defined in # main/01_exim4-config_listmacrosdefs: # CHECK_RCPT_REMOTE_LOCALPARTS = ^[./|] : ^.*[@%!`#&?] : ^.*/\\.\\./ # It allows local users to send outgoing messages to sites # that use slashes and vertical bars in their local parts. It blocks # local parts that begin with a dot, slash, or vertical bar, but allows # these characters within the local part. However, the sequence /../ is # barred. The use of some other non-alphanumeric characters is blocked. # Single quotes might probably be dangerous as well, but they're # allowed by the default regexps to avoid rejecting mails to Ireland. # The motivation here is to prevent local users (or local users' malware) # from mounting certain kinds of attack on remote sites.
Mis à jour par Thomas Noël il y a plus de 3 ans
Mon avis c'est que si on veut "contrôler" on n'y arrivera pas, il faut javascripter le truc comme pour le contrôle des domaines ("attention, votre adresse ne semble pas valable, vérifiez-là bien" quand la partie gauche contient des trucs étranges, mais bon j'ai pas vraiment de regex à fournir)
Et pour la 500 que se tape l'usager qui veut quand même valider la page, je pense comme vous : remonter SMTP jusqu'à l'utilisateur (SMTPRecipientsRefused) sans tracer.
Mis à jour par Frédéric Péters il y a plus de 3 ans
je pense comme vous : remonter SMTP jusqu'à l'utilisateur (SMTPRecipientsRefused) sans tracer
Sûr ok "sans tracer" mais ma position est plutôt de détecter en amont, en ayant au niveau de la validation les mêmes restrictions que dans exim.
Mis à jour par Thomas Noël il y a plus de 3 ans
Frédéric Péters a écrit :
je pense comme vous : remonter SMTP jusqu'à l'utilisateur (SMTPRecipientsRefused) sans tracer
Sûr ok "sans tracer" mais ma position est plutôt de détecter en amont, en ayant au niveau de la validation les mêmes restrictions que dans exim.
C'est ce que je propose, mais comme pour les domaines, le faire plutôt en javascript (je ne vois pas comment autrement, sauf des choses que je n'aime pas)
Mis à jour par Benjamin Dauvergne il y a plus de 3 ans
Bon je pense quand même qu'une première mesure serait d'intercepter les SMTPError dans form_valid(), il n'y a pas que les adresses mal-formés qui font ce genre d'erreurs, on verra plus tard pour la regexp qui plaît à tout le monde.
Mis à jour par Frédéric Péters il y a plus de 3 ans
C'est ce que je propose, mais comme pour les domaines, le faire plutôt en javascript (je ne vois pas comment autrement, sauf des choses que je n'aime pas)
Il y a déjà de la validation, côté serveur, il s'agirait "juste" de l'étendre :
--- a/src/authentic2/validators.py +++ b/src/authentic2/validators.py @@ -82,6 +82,7 @@ class EmailValidator(object): DjangoEmailValidator()(value) localpart, hostname = value.split('@', 1) + # ici vérifier localpart if app_settings.A2_VALIDATE_EMAIL_DOMAIN: mxs = self.query_mxs(hostname) if not mxs:
Mis à jour par Benjamin Dauvergne il y a plus de 3 ans
- Fichier 0001-misc-add-more-checks-on-email-address-localpart-4813.patch 0001-misc-add-more-checks-on-email-address-localpart-4813.patch ajouté
- Tracker changé de Bug à Development
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Mis à jour par Valentin Deniaud il y a plus de 3 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Benjamin Dauvergne il y a plus de 3 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit f89842ffab3ec4aa0526ca0ce53583c45874613e Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Sun Nov 1 00:35:06 2020 +0100 misc: add more checks on email address localpart (#48133)
Mis à jour par Frédéric Péters il y a plus de 3 ans
- Statut changé de Résolu (à déployer) à Solution déployée
misc: add more checks on email address localpart (#48133)