regular expressions - Jusqu'où faut-il prendre e

Translate

Je me demande jusqu'où les gens devraient prendre la validation de l'adresse e-mail. Mon domaine est principalement le développement Web, mais cela s'applique partout.

J'ai vu quelques approches:

  • vérifier simplement s'il y a un "@" présent, ce qui est très simple mais bien sûr pas si fiable.
  • un test regex plus complexe pour les formats de courrier électronique standard
  • a regex complètecontreRFC 2822- le problème avec ceci est que souvent une adresse e-mail peut être valide mais ce n'est probablement pas ce que l'utilisateur voulait dire
  • Validation DNS
  • Validation SMTP

Comme beaucoup de gens le savent (mais beaucoup ne le savent pas), les adresses électroniques peuvent présenter de nombreuses variantes étranges que la plupart des gens ne considèrent généralement pasRFC 2822 3.4.1), mais vous devez réfléchir aux objectifs de votre validation: essayez-vous simplement de vous assurer qu'un message électronique peut être envoyé à une adresse, ou que c'est ce que l'utilisateur a probablement voulu mettre (ce qui est peu probable dans beaucoup des cas les plus obscurs d'adresses autrement «valides»).

Une option que j'ai envisagée est simplement de donner un avertissement avec une adresse plus ésotérique tout en permettant à la demande de passer, mais cela ajoute plus de complexité à un formulaire et la plupart des utilisateurs sont susceptibles d'être confus.

Alors que la validation DNS / la validation SMTP semble être une évidence, je prévois des problèmes où le serveur DNS / serveur SMTP est temporairement arrêté et un utilisateur ne peut pas s'enregistrer quelque part, ou le serveur SMTP de l'utilisateur ne prend pas en charge les fonctionnalités requises.

Comment certains développeurs expérimentés pourraient-ils gérer cela? Existe-t-il d'autres approches que celles que j'ai énumérées?

Edit: j'ai complètement oublié le plus évident de tous, l'envoi d'un e-mail de confirmation! Merci aux répondeurs de l'avoir signalé. Oui, celui-ci est assez infaillible, mais il nécessite des tracas supplémentaires de la part de toutes les personnes impliquées. L'utilisateur doit récupérer des e-mails et le développeur doit se souvenir des données utilisateur avant même qu'elles ne soient confirmées comme valides.

This question and all comments follow the "Attribution Required."

Toutes les réponses

Parker Lee
Translate

Il n'y a pas de moyen fiable à 100% de confirmer une adresse e-mail valide autre que d'envoyer un e-mail à l'utilisateur et d'attendre une réponse, comme la plupart des forums.

J'irais avec la simple règle de validation "@" et puis envoyer un e-mail à l'utilisateur pour confirmer son adresse e-mail.

Bien que ce soit mon opinion personnelle ... J'attends d'autres suggestions.

La source
Hiram Lee
Translate

Une suggestion: ne rejetez pas les adresses contenant un +. Il est très courant de les rejeter, mais c'est un caractère valide, et les utilisateurs de gmail peuvent utiliser [email protected] pour étiqueter et trier plus facilement le courrier entrant.

La source
Newman Lee
Translate

Dans votre message, il semble que lorsque vous dites «validation SMTP», vous voulez dire vous connecter au serveur et essayer un RCPT TO pour voir s'il est accepté. Puisque vous le différenciez de l'envoi réel d'un e-mail de confirmation, je suppose que vous voulez le faire en ligne avec les actions de l'utilisateur. En plus des problèmes tels que les problèmes de réseau, les pannes DNS, etc., la liste grise peut faire des ravages avec cette méthode. Les méthodes varient, mais la liste grise diffère toujours la première tentative de livraison au destinataire par IP de connexion. Comme je l'ai dit, cela peut varier, certains hôtes peuvent rejeter des adresses invalides à la première tentative et ne différer que des adresses valides, mais il n'y a pas de moyen fiable de trier les différentes implémentations par programme.

La seule façon de vous assurer qu'une adresse est valide et qu'elle est soumise par son propriétaire qui souhaite vraiment qu'elle soit utilisée pour votre application est d'envoyer un e-mail de vérification. Eh bien, tant qu'il n'est pas filtré anti-spam, je suppose =).

La source
Edith Lee
Translate

Une autre faiblesse de l'utilisation d'une expression régulière pour la validation des e-mails est qu'il est presque impossible d'attraper tous lesdomaines de premier niveautout en rejetant tous les invalides.

Par exemple, l'expression régulière de base de l'e-mail dans la réponse de Jeff Atwood:

\ b [A-Z0-9 ._% + -] + @ [A-Z0-9 .-] +. [AZ] {2,4} \ b

acceptera tout TLD de deux à quatre caractères. Ainsi, par exemple, .spam sera accepté, mais .museum et .travel (tous deux TLD valides) seront rejetés.

Encore une raison pour laquelle il est préférable de rechercher simplement @ et d'envoyer un e-mail de confirmation.

La source
Translate

Avec des noms de domaine internationauxpresquetout est possible:

Si vous voulez faire des tests, vous devez d'abord le convertir en punycode.

Sans punycode, tout ce que vous devez faire est de le tester:

  • est au moins un @
  • est au moins un caractère dans la partie locale
  • est au moins un point dans la partie domaine
  • contient au moins quatre caractères dans le domaine (en supposant que personne n'a d'adresse au tld, que le tld soit au moins 2 caractères)
function isEmail(address) {
    var pos = address.lastIndexOf("@");
    return pos > 0 && (address.lastIndexOf(".") > pos) && (address.length - pos > 4);
}
La source
Blithe Lee
Translate

Il vaut mieux vérifier simplement des choses simples comme @ et. en JavaScript, puis envoyez-leur une vérification à leur adresse e-mail. S'ils vérifient leur compte, vous avez vous-même une adresse e-mail valide. De cette façon, vous savez avec certitude que vous avez une adresse de travail et vous n'avez pas besoin d'être trop autoritaire dans le formulaire.

La source
Translate

Utilisez un validateur open source qui ne donne pas de faux négatifs. Aucun effort pour vous et une validation robuste pour votre application.

J'ai maintenant rassemblé des cas de test de Cal Henderson, Dave Child, Phil Haack, Doug Lovell et RFC 3696. 158 adresses de test en tout.

J'ai effectué tous ces tests sur tous les validateurs que j'ai pu trouver. La comparaison est ici:http://www.dominicsayers.com/isemail

J'essaierai de garder cette page à jour à mesure que les gens améliorent leurs validateurs. Merci à Cal, Dave et Phil pour leur aide et leur coopération dans la compilation de ces tests et la critique constructive demon propre validateur.

Les gens doivent être conscients de laerrata contre RFC 3696en particulier. Trois des exemples canoniques sont en fait des adresses invalides. Et la longueur maximale d'une adresse est de 254 ou 256 caractères,ne pas320.

La source
Jesse Lee
Translate

Compte tenu des réponses (puisque j'ai complètement oublié les e-mails de confirmation), il me semble qu'un compromis approprié pour une solution à faible friction serait de:

  1. Utilisez regex pour vérifier que l'adresse e-mail semble valide et donnez un avertissement si elle est plus obscure, mais évitez de rejeter carrément.
  2. Utilisez la validation SMTP pour vous assurer que l'adresse e-mail est valide.
  3. Si la validation SMTPéchouepuis - etseulement à ce moment-là- utilisez un e-mail de confirmation en dernier recours. Les e-mails de confirmation semblent nécessiter trop d'interactions en dehors de votre application pour être considérés comme à faible friction, mais ils constituent une solution de secours parfaite.
La source
Sara Lee
Translate

RegexBuddypropose les expressions régulières suivantes liées aux e-mails à partir de sa bibliothèque:

Adresse e-mail (basique)

\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b

Adresse e-mail (RFC 2822, simplifiée)

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

Mais j'ai tendance à être d'accord avec les réponses de Peter et SuperJoe; le seul véritable "test" est en fait l'envoi d'un e-mail de validation.

La source
Drew Lee
Translate

J'ai travaillé dans 4 entreprises différentes où quelqu'un du service d'assistance a été crié dessus par quelqu'un nommé O'Malley ou O'Brien ou une autre adresse e-mail avec une apostrophe. Comme suggéré précédemment, toutes les expressions rationnelles n'attraperont pas tout, mais évitez les tracas et acceptez une apostrophe sans générer d'avertissement.

--
bmb

La source
Fay Lee
Translate

Vous pouvez pousser plus loin la validation des e-mails pour tester réellement l'existence d'une boîte aux lettres. Cette technique a ses inconvénients (temps de développement et également possibilité d'être mis sur liste noire pour mauvaise utilisation).http://www.webdigi.co.uk/blog/2009/how-to-check-if-an-email-address-exists-without-sending-an-email/

La source
Eden Lee
Translate

Si tu veuxVérifierun e-mail (c.-à-d. assurez-vous que l'utilisateur possède l'adresse e-mail), un e-mail de confirmation est la seule chose que vous pouvez faire. Là encore, de nombreuses personnes ont des adresses de spam dédiées ou utilisent des services tels queOneWayMailet s'ils ne veulent pas vous donner leur adresse e-mail réelle, ils ne le feront pas. Donc, fondamentalement, vous créez une obstruction utilisateur.

Quand cela vient àvalidation, pour s'assurer que l'utilisateur n'entre pas involontairement une mauvaise adresse e-mail, c'est définitivement la bonne motivation. Cependant, au moins pour les formulaires HTML (qui sont de loin le moyen le plus courant de collecter des adresses e-mail), ce n'est guère le bon instrument.

D'une part, vous ne pourrez pas reconnaître les fautes de frappe dans les "mots" réels de l'adresse e-mail. Tu n'as aucun moyen de le découvrir[email protected]est faux, uniquement basé sur le format.
Mais plus important encore, du point de vue de l'utilisateur, il n'y a qu'une (ou une main pleine) d'adresses e-mail que vous pourriez vouloir saisir. Et vous l'avez probablement déjà entré.
Ainsi, plutôt que d'essayer de valider une adresse, vous devez vous assurer que tous les navigateurs reconnaissent le champ e-mail et éliminent ainsi le besoin de saisir l'adresse e-mail en premier lieu. Bien sûr, cela ne s'applique pas si vous créez le type de site susceptible d'être touché par des utilisateurs qui n'ont jamais entré leur adresse e-mail dans leur navigateur auparavant. Mais je suppose que les plus petits d'entre nous sont dans une telle position.

La source
Christian Lee
Translate

Je pense que cela dépend du contexte dans lequel vous utilisez l'e-mail. Les projets plus sérieux nécessitent une validation plus stricte, mais je pense que pour la plupart des choses, l'envoi d'un e-mail à l'adresse fournie avec un lien de confirmation garantira que l'adresse e-mail est valide.

La source
Translate

@Mike- Je pense qu'une partie de la raison pour laquelle les e-mails de confirmation sont envoyés n'est pas seulement de s'assurer que l'adresse e-mail est valide, mais qu'elle est accessible par l'utilisateur qui l'a soumise. Une personne pourrait facilement insérer une faute de frappe d'une lettre dans l'adresse e-mail qui conduirait à une adresse e-mail différente et valide, mais ce serait toujours une erreur car ce serait lefauxadresse.

La source
Spring Lee
Translate

Le regex le plus complet et le plus précis que j'ai jamais rencontré pour la validation des e-mails est celui documentéici. Ce n'est pas pour les faibles de cœur; il est suffisamment compliqué pour être divisé en plusieurs parties pour faciliter l'analyse par les humains (un exemple de code est en Java). Mais dans les cas où aller jusqu'au bout avec la validation est mérité, je ne pense pas que ça va beaucoup mieux.

Dans tous les cas, je vous suggère d'utiliser des tests unitaires pour confirmer que votre expression couvre les cas que vous jugez importants. De cette façon, au fur et à mesure que vous discutez avec, vous pouvez être sûr que vous n'avez pas cassé une affaire qui fonctionnait auparavant.

La source
Jacob Lee
Translate

Quoi que vous choisissiez, je pense que vous devez vous tromper en pensant que 99% du temps, l'utilisateurEst-ce quesavoir quelle est leur adresse e-mail. En tant que Australien, je trouve encore très occasionnellement une validation d'e-mail si intelligente qui me dit que je ne peux pas avoir de domaine .com.au. Cela se produisait beaucoup plus dans les premiers jours de l'Internet, remarquez.

L'envoi d'un e-mail de confirmation ces jours-ci est acceptable pour les utilisateurs, et est également utile en termes d'acceptation ainsi que de validation de l'adresse fournie.

La source
Anastasia Lee
Translate

Sur certains sites développés dans des endroits où j'ai travaillé, nous avons toujours utilisé des e-mails de confirmation. Cependant, il était étonnamment courant pour les utilisateurs de mal saisir leur adresse e-mail d'une manière qui n'aurait pas pu fonctionner, puis de continuer à attendre l'e-mail de confirmation qui ne viendrait pas. L'ajout de code ad hoc (ou, pour la partie nom de domaine, vérification DNS) pour avertir l'utilisateur dans ces cas pourrait être une bonne idée.

Les cas courants que j'ai vus:

  • Déposer une lettre au milieu du nom de domaine, ou plusieurs autres variantes de typo simples.
  • Confusion TLD (par exemple, l'ajout d'un.brà un.comdomaine, ou en supprimant le.brde.com.brdomaine).
  • Ajout d'unwww.au début de la partie locale d'une adresse e-mail (je n'invente pas cela; j'ai vunombreusesadresses e-mail du formulaire[email protected]).

Il y avait des cas encore plus bizarres; des choses comme un completnom de domainecomme partie locale, adresses avec deux@(quelque chose comme[email protected]@example.com), etc.

Bien sûr, la plupart d'entre eux étaient toujours des adresses RFC-822 valides, donctechniquementvous pouvez simplement laisser le MTA s'en occuper. Cependant, avertir l'utilisateur que l'adresse e-mail saisie est très probablement fausse peut être utile, surtout si votre public cible n'est pas très instruit en informatique.

La source
Joanna Lee
Translate

Toutes les validations de regex dans le monde n'empêcheront personne de saisir une adresse e-mail incorrecte ou fausse. C'est juste ennuyeux, vraiment.

La source
Translate

Cela dépend du but. Si vous êtes un FAI et que vous devez valider que les utilisateurs créent des adresses e-mail valides, optez pour le Regex qui valide tout ce qui est possible. Si vous souhaitez simplement détecter les erreurs des utilisateurs, que diriez-vous du modèle suivant:

[Tous les caractères, sans espaces] @ [lettres et chiffres] (. [Lettres et chiffres]) où le groupe final apparaît au moins une fois.

Le RegEx pour cela apparaîtrait quelque chose comme ceci:

[\S][email protected][\w]+(.[\w-]+)+

Et puis envoyez un e-mail de confirmation pour être sûr.

La source
Translate

@Yaakov(pourrait répondre avec une sorte de `` réponse '' ici)

Je pense qu'une partie de la raison pour laquelle les e-mails de confirmation sont envoyés n'est pas seulement de s'assurer que l'adresse e-mail est valide, mais qu'elle est accessible par l'utilisateur qui l'a soumise. Une personne pourrait facilement insérer une faute de frappe d'une lettre dans l'adresse e-mail qui conduirait à une adresse e-mail différente et valide, mais ce serait toujours une erreur car ce serait la mauvaise adresse.

Je suis d'accord, mais je ne suis pas sûr que cela en vaille la peine. Nous avons également des champs de confirmation à cet effet (en répétant à nouveau votre adresse e-mail). Une autre situation où le type de site peut justifier des approches différentes.

De plus, l'envoi d'un e-mail de confirmation ne donne aucun moyen d'indiquer à l'utilisateur d'origine que l'adresse qu'il a saisie était erronée. Après ne pas avoir reçu l'e-mail de confirmation, ils peuvent simplement supposer que votre application / site est défectueux; au moins en permettant à l'utilisateur de commencer immédiatement à utiliser son compte, il pourrait corriger son adresse e-mail, en particulier si elle est affichée à un endroit suffisamment évident.

La source
Liz Lee
Translate

Chevaux de course.

Tous ces systèmes sont valides et complets de vérification des e-mails en eux-mêmes, et pour un site Web donné, l'un sera plus approprié (ou aussi bon que garanti) que les autres. Dans de nombreux cas, plusieurs étapes de vérification peuvent être utiles.

Si vous développez un site Web pour une banque, vous aurez besoin d'une vérification par courrier postal ou par téléphone en plus de tout cela.

Si vous développez un site Web pour un concours, vous ne voudrez peut-être aucun d'entre eux - vérifiez les e-mails en post-traitement et si l'un d'entre eux échoue, c'est dommage pour la personne qui l'a inscrit - vous pourriez apprécier les performances du serveur étant donné un énorme coup de cœur de personnes ( Concours télévisé, par exemple) pour s'assurer que tout le monde est correctement validé en ligne.

Jusqu'où faut-il prendre la vérification des e-mails?

Autant que nécessaire et justifié.

Et pas plus (KISS)

La source
Archer Lee
Translate

J'ai vu des sites qui se prémunissent également contre les personnes utilisant des sites de seaux de spam jetables temporaires commeMailinatorouMyTrashMail, qui contournent la chose e-mail de confirmation. Je ne dis pas que vous devriez les filtrer, je dis simplement.

La source
Dorothy Lee
Translate

Qu'essayez-vous d'attraper dans votre validation par e-mail?

La validation Regex des adresses e-mail peut, au mieux, vérifier que l'adresse est syntaxiquement correcte et relativement plausible. Il présente également le risque (comme déjà mentionné à plusieurs reprises) de rejeter les adresses livrables réelles si l'expression régulière n'est pas tout à fait correcte.

La vérification SMTP peut déterminer que l'adresse est livrable, sous réserve des limitations imposées par la liste grise ou les serveurs configurés pour donner le moins d'informations possible sur leurs utilisateurs. Vous n'avez aucun moyen de savoir si le MTA a seulement prétendu accepter du courrier pour une fausse adresse, puis l'a simplement laissé tomber dans le cadre d'une stratégie anti-spam.

L'envoi d'un message de confirmation, cependant, est leseulementmoyen de vérifier qu'une adresse appartient à l'utilisateur qui l'a saisie. Si je remplis votre formulaire, je peux facilement vous dire que mon adresse e-mail est[email protected]. Un regex vous dira qu'il est syntaxiquement valide, un SMTP RCPT TO vous dira que c'est une adresse livrable, mais ce n'est certainement pas le casmyadresse.

La source
Sally Lee
Translate

Avec l'arrivée du HTML5, au moins une nouvelle approche s'ajoute aux possibilités: l'utilisation de l'entrée de type 'email' ce qui permetvalidationcôté client. Les versions actuelles de Firefox, Chrome, Safari et Opera le prennent en charge (et les autres navigateurs le traitent simplement comme type = text, donc il peut être utilisé sans problème bien que vous n'ayez pas de validation bien sûr.)

Cela ne peut jamais (comme cela a été souligné à quelques reprises) garantir une adresse utilisable, mais cela peut être très bénéfique (et éventuellement remplacer la vérification côté serveur) dans les endroits où vous avez juste besoin de détecter les erreurs d'utilisateurs probables.

La source
Translate

Les trois principaux niveaux de validation des e-mails:

1) Vérification des expressions régulières pour une adresse e-mail correctement formatée [email protected]

2) Vérification du domaine de messagerie par rapport aux enregistrements MX pour voir si le nom de domaine dispose d'un service de messagerie

3) envoyer un e-mail de confirmation avec un lien ou un code de confirmation

Niveau 1:

Dans Visual Studio, vous pouvez utiliser le «validateur d'expressions régulières». Et dans la propriété "ValidationExpression", vous pouvez cliquer sur le bouton "..." qui a un assistant à ajouter dans le format d'expression régulière pour les adresses e-mail.

Niveau 2:

Voici mon code C # ci-dessous pour utiliser nslookup pour vérifier si un domaine de messagerie possède des enregistrements MX valides. Fonctionne rapidement et correctement sur Win 2008 R2 et Win 7.

using System.Net.Mail;
using System.Diagnostics;

public static bool checkMXRecords(string email) 
    {
        MailAddress addr = new MailAddress(email);
        string domain = addr.Host;

        string command = "nslookup -querytype=mx " + domain;
        ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c " + command);

        procStartInfo.RedirectStandardOutput = true;
        procStartInfo.UseShellExecute = false;

        procStartInfo.CreateNoWindow = true;

        Process proc = new Process();
        proc.StartInfo = procStartInfo;
        proc.Start();
        string result = proc.StandardOutput.ReadToEnd();

        if (result.ToLower().Contains("mail exchanger"))
        {
            return true;
        }
        else return false;

     } // checkMXRecords

une autre option consiste à utiliser le package nuget Arsofttools, mais il peut être lent sur Windows Server 2008 R2 comme je l'ai expérimenté, mais fonctionne rapidement sur Win 7.

Niveau 3:

Pour la confirmation par e-mail, vous pouvez soit générer une URL hexadécimale spécifique à l'e-mail (à l'aide des fonctions de chiffrement), etc.http://domain.com/validateEmail?code=abcd1234pour valider l'adresse e-mail lorsque l'utilisateur clique dessus. Il n'est pas nécessaire de stocker cette URL en mémoire.

La source