Qu'utilisez-vous pour valider les adresses e-mail des utilisateurs et pourquoi?
J'avais utilisé validates_email_veracity_of
qui interroge en fait les serveurs MX. Mais cela est plein d'échecs pour diverses raisons, principalement liées au trafic et à la fiabilité du réseau.
J'ai regardé autour de moi et je n'ai rien trouvé d'évident que beaucoup de gens utilisent pour effectuer un contrôle de cohérence sur une adresse e-mail. Existe-t-il un plugin ou un bijou maintenu et raisonnablement précis pour cela?
PS: Veuillez ne pas me dire d'envoyer un e-mail avec un lien pour voir si l'e-mail fonctionne. Je développe une fonction "envoyer à un ami", donc ce n'est pas pratique.
ruby-on-rails
validation
email
Luc Francl
la source
la source
Réponses:
Avec Rails 3.0, vous pouvez utiliser une validation par e-mail sans expression régulière en utilisant le gem Mail .
Voici mon implémentation ( emballée comme un bijou ).
la source
###@domain.com
valider?Ne rendez pas cela plus difficile que nécessaire. Votre fonctionnalité n'est pas critique; la validation n'est qu'une étape de base pour détecter les fautes de frappe. Je le ferais avec une simple regex, et ne gaspillerais pas les cycles du processeur sur quelque chose de trop compliqué:
Cela a été adapté de http://www.regular-expressions.info/email.html - que vous devriez lire si vous voulez vraiment connaître tous les compromis. Si vous voulez une expression régulière plus correcte et beaucoup plus compliquée entièrement conforme à la RFC822, c'est également sur cette page. Mais la chose est la suivante: vous n'êtes pas obligé de bien faire les choses.
Si l'adresse passe la validation, vous allez envoyer un e-mail. Si l'e-mail échoue, vous recevrez un message d'erreur. À quel moment vous pouvez dire à l'utilisateur "Désolé, votre ami n'a pas reçu cela, souhaitez-vous réessayer?" ou signalez-le pour examen manuel, ou ignorez-le simplement, ou autre chose.
Ce sont les mêmes options que vous auriez à traiter si l'adresse ne passe validation. Car même si votre validation est parfaite et que vous acquérez la preuve absolue que l'adresse existe, l'envoi pourrait encore échouer.
Le coût d'un faux positif à la validation est faible. L'avantage d'une meilleure validation est également faible. Validez généreusement et craignez les erreurs lorsqu'elles se produisent.
la source
J'ai créé un joyau pour la validation des e-mails dans Rails 3. Je suis un peu surpris que Rails n'inclue pas quelque chose comme ça par défaut.
http://github.com/balexand/email_validator
la source
if
orunless
? La documentation semble rare.Ce projet semble avoir le plus d'observateurs sur github pour le moment (pour la validation des emails dans les rails):
https://github.com/alexdunae/validates_email_format_of
la source
À partir de la documentation Rails 4 :
la source
Dans Rails 4, ajoutez simplement
validates :email, email:true
(en supposant que votre champ est appeléemail
) à votre modèle, puis écrivez un simple (ou complexe †)EmailValidator
en fonction de vos besoins.ex: - votre modèle:
Votre validateur (entre
app/validators/email_validator.rb
)Cela permettra à toutes sortes d'e - mails valides, y compris tagged e-mails comme "[email protected]" et ainsi de suite.
Pour tester cela avec
rspec
dans votrespec/validators/email_validator_spec.rb
C'est comme ça que je l'ai fait de toute façon. YMMV
† Les expressions régulières sont comme la violence; s'ils ne fonctionnent pas, vous n'en utilisez pas suffisamment.
la source
Comme le suggère Hallelujah, je pense que l'utilisation de la gemme Mail est une bonne approche. Cependant, je n'aime pas certains des cerceaux là-bas.
J'utilise:
Vous pourriez être plus strict en exigeant que les TLD (domaines de premier niveau) figurent dans cette liste , mais vous seriez obligé de mettre à jour cette liste à mesure que de nouveaux TLD apparaissent (comme l'ajout de 2012
.mobi
et.tel
)L'avantage de l'accrochage direct de l'analyseur est que les règles de la grammaire Mail sont assez larges pour les portions
user<[email protected]>
utilisées par le gem Mail, il est conçu pour lui permettre d'analyser une adresse comme celle qui est courante pour SMTP. En le consommant,Mail::Address
vous êtes obligé de faire un tas de vérifications supplémentaires.Une autre note concernant le gem Mail, même si la classe est appelée RFC2822, la grammaire contient certains éléments de la RFC5322 , par exemple ce test .
la source
Dans Rails 3, il est possible d'écrire un validateur réutilisable , comme l'explique cet excellent article:
http://archives.ryandaigle.com/articles/2009/8/11/what-s-new-in-edge-rails-independent-model-validators
et utilisez-le avec
validates_with
:la source
En notant les autres réponses, la question demeure: pourquoi se donner la peine d'être intelligent à ce sujet?
Le volume réel de cas limites que de nombreuses expressions régulières peuvent nier ou manquer semble problématique.
Je pense que la question est «qu'est-ce que j'essaye d'atteindre?», Même si vous «validez» l'adresse e-mail, vous ne validez pas réellement qu'il s'agit d'une adresse e-mail fonctionnelle.
Si vous optez pour une expression régulière, vérifiez simplement la présence de @ côté client.
En ce qui concerne le scénario de courrier électronique incorrect, ayez une branche «message échoué à envoyer» à votre code.
la source
Il existe essentiellement 3 options les plus courantes:
Si vous ne voulez pas utiliser à la fois validates_email_veracity_of et la génération de jetons, j'irais avec la vérification des expressions rationnelles à l'ancienne.
la source
La gemme Mail a un analyseur d'adresses intégré.
la source
Cette solution est basée sur les réponses de @SFEley et @Alessandro DS, avec un refactor et une clarification d'utilisation.
Vous pouvez utiliser cette classe de validation dans votre modèle comme ceci:
Étant donné que vous avez les éléments suivants dans votre
app/validators
dossier (Rails 3):la source
Pour la validation des listes de diffusion . (J'utilise Rails 4.1.6)
J'ai obtenu mon expression rationnelle d' ici . Il semble être très complet, et il a été testé contre un grand nombre de combinaisons. Vous pouvez voir les résultats sur cette page.
Je l'ai légèrement changé en une expression rationnelle Ruby, et je l'ai mis dans mon
lib/validators/email_list_validator.rb
Voici le code:
Et je l'utilise comme ça dans le modèle:
Il validera des listes de diffusion comme celle-ci, avec différents séparateurs et synthax:
Avant d'utiliser cette expression rationnelle, j'utilisais
Devise.email_regexp
, mais c'est une expression rationnelle très simple et je n'ai pas obtenu tous les cas dont j'avais besoin. Certains e-mails ont été renvoyés.J'ai essayé d'autres expressions régulières du Web, mais celle-ci a obtenu les meilleurs résultats jusqu'à présent. J'espère que cela aide dans votre cas.
la source