Quel est le code le plus élégant pour valider qu'une chaîne est une adresse e-mail valide?
c#
email
email-validation
leora
la source
la source
Réponses:
Et ça?
Pour clarifier, la question demande si une chaîne particulière est une représentation valide d'une adresse de messagerie, et non si une adresse de messagerie est une destination valide pour envoyer un message. Pour cela, le seul vrai moyen est d'envoyer un message pour confirmer.
Notez que les adresses e-mail sont plus indulgentes que vous ne le pensez. Ce sont tous des formulaires parfaitement valables:
Pour la plupart des cas d'utilisation, un faux "invalide" est bien pire pour vos utilisateurs et l'épreuve du temps qu'un faux "valide". Voici un article qui était la réponse acceptée à cette question (cette réponse a depuis été supprimée). Il contient beaucoup plus de détails et quelques autres idées sur la façon de résoudre le problème.
Fournir des contrôles d'intégrité est toujours une bonne idée pour l'expérience utilisateur. En supposant que l'adresse e-mail est valide, vous pouvez rechercher des domaines de premier niveau connus, rechercher un enregistrement MX dans le domaine, rechercher des erreurs d'orthographe à partir de noms de domaine communs (gmail.cmo), etc. Ensuite, présenter un avertissement donnant à l'utilisateur une chance de dire "oui, mon serveur de messagerie autorise vraiment 🌮🍳🎁 comme adresse e-mail."
Quant à l'utilisation de la gestion des exceptions pour la logique métier, je suis d'accord que c'est une chose à éviter. Mais c'est l'un de ces cas où la commodité et la clarté peuvent l'emporter sur le dogme.
De plus, si vous faites autre chose avec l'adresse e-mail, cela impliquera probablement de la transformer en MailAddress. Même si vous n'utilisez pas cette fonction exacte, vous voudrez probablement utiliser le même modèle. Vous pouvez également rechercher des types d'échecs spécifiques en interceptant différentes exceptions : format nul, vide ou non valide.
Selon le commentaire de Stuart, cela compare l'adresse finale avec la chaîne d'origine au lieu de toujours retourner true. MailAddress essaie d'analyser une chaîne avec des espaces dans les parties "Nom d'affichage" et "Adresse", de sorte que la version d'origine renvoyait des faux positifs.
--- Lectures complémentaires ---
Documentation pour System.Net.Mail.MailAddress
Explication de ce qui constitue une adresse e-mail valide
la source
System.Net.Mail
classes pour envoyer du courrier, ce que vous êtes probablement si vous utilisez .NET. Nous avons décidé d'utiliser ce type de validation simplement parce qu'il est inutile d'accepter des adresses e-mail - même valides - auxquelles nous ne pouvons pas envoyer de courrier.IsValidEmail("this is not valid@email$com");
C'est une vieille question, mais toutes les réponses que j'ai trouvées sur SO, y compris les plus récentes, reçoivent une réponse similaire à celle-ci. Cependant, dans .Net 4.5 / MVC 4, vous pouvez ajouter une validation d'adresse e-mail à un formulaire en ajoutant l'annotation [EmailAddress] de System.ComponentModel.DataAnnotations, donc je me demandais pourquoi je ne pouvais pas simplement utiliser la fonctionnalité intégrée de. Net en général.
Cela semble fonctionner et me semble assez élégant:
la source
EmailAddressAttribute
est moins permissif queSystem.Net.Mail.MailAddress
- par exemple,MailAddress
accepte une adresse pour un TLD. Juste quelque chose à garder à l'esprit si vous devez être aussi permissif que possible.foo.IsValid(null);
retourstrue
.J'utilise cette méthode de doublure unique qui fait le travail pour moi-
D'après les commentaires, cela "échouera" si
source
(l'adresse e-mail) est nulle.la source
public static Boolean IsValidMailAddress(this String pThis) => pThis == null ? false : new EmailAddressAttribute().IsValid(pThis);
public static bool IsValidEmailAddress(this string address) => address != null && new EmailAddressAttribute().IsValid(address);
false
pour les chaînes nulles. Voilà pourquoi je propose la (encore mieux mieux) ++ version:public static bool IsValidEmailAddress(this string address) => new EmailAddressAttribute().IsValid(address ?? throw new ArgumentNullException());
. Je vais maintenant aller trouver l'Église réformée des versionnistes encore meilleurs et meilleurs..net 4.5 a ajouté System.ComponentModel.DataAnnotations.EmailAddressAttribute
Vous pouvez parcourir la source de EmailAddressAttribute , c'est le Regex qu'il utilise en interne:
la source
RegexOptions.IgnoreCase
car ce modèle n'autorise pas explicitement les majuscules!J'ai pris la réponse de Phil de # 1 et créé cette classe. Appelez ça comme ceci:
bool isValid = Validator.EmailIsValid(emailString);
Voici la classe:
la source
Personnellement, je dirais que vous devez simplement vous assurer qu'il y a un symbole @, éventuellement avec un. personnage. Il existe de nombreuses expressions rationnelles que vous pourriez utiliser avec une exactitude variable, mais je pense que la plupart d'entre elles omettent des adresses e-mail valides ou laissent passer des adresses invalides. Si les gens veulent mettre une fausse adresse e-mail, ils en mettront une fausse. Si vous devez vérifier que l'adresse e-mail est légitime et que la personne contrôle cette adresse e-mail, vous devrez lui envoyer un e-mail avec un lien codé spécial afin qu'elle puisse vérifier qu'il s'agit bien d'une véritable adresse.
la source
Je pense que la meilleure façon est la suivante:
Vous pouvez avoir cette fonction statique dans une classe générale.
la source
Code court et précis
la source
La manière la plus élégante est d'utiliser les méthodes intégrées de .Net.
Ces méthodes:
Sont essayés et testés. Ces méthodes sont utilisées dans mes propres projets professionnels.
Utilisez des expressions régulières en interne, fiables et rapides.
Fabriqué par Microsoft pour C #. Inutile de réinventer la roue.
Renvoie un résultat booléen. Vrai signifie que l'e-mail est valide.
Pour les utilisateurs de .Net 4.5 et supérieur
Ajoutez cette référence à votre projet:
Vous pouvez maintenant utiliser le code suivant:
Exemple d'utilisation
Voici quelques méthodes pour déclarer:
... et un code les démontrant en action:
De plus, cet exemple:
;
.Alternative, pour les utilisateurs d'une version de .Net inférieure à 4,5
Pour les situations où .Net 4.5 n'est pas disponible, j'utilise la solution suivante:
Plus précisément, j'utilise:
la source
EmailAddressAttribute
peu moins de quatre mois, bien que celui-ci ait bien compris lenull
problème.Pour être honnête, dans le code de production, le mieux que je fais est de rechercher un
@
symbole.Je ne suis jamais en mesure de valider complètement les e-mails. Vous savez comment je vois si c'était vraiment valable? Si elle a été envoyée. Si ce n'est pas le cas, c'est mauvais, si c'est le cas, la vie est belle. C'est tout ce que je dois savoir.
la source
Je trouve que cette expression régulière est un bon compromis entre la vérification de quelque chose de plus que la simple marque @ et l'acceptation de cas étranges:
Cela vous fera au moins mettre quelque chose autour de la marque @ et mettre au moins un domaine d'apparence normale.
la source
bob@companyinternal
?La validation des adresses e-mail n'est pas aussi simple que cela puisse paraître. Il est en fait théoriquement impossible de valider complètement une adresse e-mail en utilisant simplement une expression régulière.
Consultez mon blog à ce sujet pour une discussion sur le sujet et une implémentation F # à l'aide de FParsec. [/ shameless_plug]
la source
Voici ma réponse - la solution de Phil échoue pour les domaines à lettre unique comme "quelqu'[email protected]". Croyez-le ou non, c'est utilisé =) (va à centurylink, par exemple).
La réponse de Phil ne fonctionnera également qu'avec la norme PCRE ... donc C # le prendra, mais javascript va exploser. C'est trop complexe pour javascript. Vous ne pouvez donc pas utiliser la solution de Phil pour les attributs de validation mvc.
Voici mon regex. Cela fonctionnera parfaitement avec les attributs de validation MVC.
- Tout avant le @ est simplifié, de sorte qu'au moins javascript fonctionne. Je suis d'accord pour relaxer la validation ici tant que le serveur d'échange ne me donne pas de 5.1.3. - Tout après la @ est la solution de Phil modifiée pour les domaines à lettre unique.
Pour les personnes suggérant d'utiliser system.net.mail MailMessage (), cette chose est FAIBLE à flexible. Bien sûr, C # acceptera l'e-mail, mais le serveur d'échange bombardera avec une erreur d'exécution 5.1.3 dès que vous essayez d'envoyer l'e-mail.
la source
basket@ball
comme adresse e-mail valide ait obtenu la bonne réponse ainsi que tous ces votes positifs. Merci quand même!Si vous voulez vraiment et je veux vraiment savoir si une adresse e-mail est valide ... demandez à l'échangeur de courrier de le prouver, aucune expression régulière n'est nécessaire. Je peux fournir le code sur demande.
Les étapes générales sont les suivantes: 1. l'adresse e-mail comporte-t-elle une partie de nom de domaine? (index de @> 0) 2. à l'aide d'une requête DNS, demandez si le domaine dispose d'un échangeur de messagerie 3. ouvrez la connexion TCP à l'échangeur de messagerie 4. à l'aide du protocole smtp, ouvrez un message au serveur en utilisant l'adresse e-mail comme récepteur 5. analyser la réponse du serveur. 6. quittez le message si vous êtes arrivé jusqu'ici, tout va bien.
C'est comme vous pouvez l'imaginer, très coûteux en temps et repose sur smtp, mais cela fonctionne.
la source
D'une manière générale, une expression régulière pour valider les adresses e-mail n'est pas une chose facile à trouver; au moment d'écrire ces lignes, la syntaxe d'une adresse e-mail doit suivre un nombre relativement élevé de normes et leur mise en œuvre au sein d'une expression régulière est pratiquement impossible!
Je vous suggère fortement d'essayer notre EmailVerify.NET , une bibliothèque .NET mature qui peut valider les adresses e-mail après tout les normes IETF actuelles (RFC 1123, RFC 2821, RFC 2822, RFC 3696, RFC 4291, RFC 5321 et RFC 5322) , teste les enregistrements DNS associés, vérifie si les boîtes aux lettres cibles peuvent accepter des messages et peuvent même dire si une adresse donnée est jetable ou non.
Avertissement: je suis le développeur principal de ce composant.
la source
la source
Si vous utilisez FluentValidation, vous pouvez écrire quelque chose d'aussi simple que ceci:
la source
une petite modification de la réponse @Cogwheel
la source
Console.WriteLine(MailAddress("asdf@asdf.").Address);
affiche "asdf @ asdf.", Ce qui n'est pas valide.Il y a beaucoup de réponses solides ici. Cependant, je recommande que nous prenions du recul. @Cogwheel répond à la question https://stackoverflow.com/a/1374644/388267 . Néanmoins, cela pourrait être coûteux dans un scénario de validation en masse, si une grande partie de l'adresse e-mail en cours de validation n'est pas valide. Je suggère que nous employions un peu de logique avant d'entrer dans son bloc try-catch. Je sais que le code suivant pourrait être écrit à l'aide de RegEx mais cela pourrait être coûteux à comprendre pour les nouveaux développeurs. C'est ma valeur de deux cents:
la source
La réponse la plus votée de @Cogwheel est la meilleure réponse, mais j'ai essayé d'implémenter
trim()
une méthode de chaîne afin de réduire tous les espaces blancs de l'utilisateur du début à la fin de la chaîne. Vérifiez le code ci-dessous pour un exemple complet-la source
SanitizeEmail(string email)
, en utilisant le résultat de cette méthode pour valider et envoyer l'e-mail à.la source
Vérifiez que la chaîne de courrier électronique est au bon format ou au mauvais format en
System.Text.RegularExpressions
:la source
/ Utilisation de la regex interne utilisée pour créer le "nouveau EmailAddressAttribute ();" composant dans .Net4.5 >>> using System.ComponentModel.DataAnnotations; // Pour valider une adresse e-mail ...... testé et fonctionnel.
Vous pouvez également utiliser ceci:
http://msdn.microsoft.com/en-us/library/01escwtf(v=vs.110).aspx
la source
J'ai succincté la réponse de Poyson 1 comme ceci:
la source
Un moyen simple d'identifier l'e-mail est valide ou non.
la source
Il y a un problème de culture dans l'expression régulière en C # plutôt qu'en js. Nous devons donc utiliser l'expression régulière en mode américain pour la vérification des e-mails. Si vous n'utilisez pas le mode ECMAScript, les caractères spéciaux de votre langue sont implicites en AZ avec regex.
la source
J'ai fini par utiliser cette expression régulière, car elle valide avec succès les virgules, les commentaires, les caractères Unicode et les adresses de domaine IP (v4).
Les adresses valides seront:
la source
Un simple sans utiliser Regex (que je n'aime pas pour sa mauvaise lisibilité):
Exemples:
IsValidEmail("@b.com") // false
IsValidEmail("[email protected]") // false
IsValidEmail("a@bcom") // false
IsValidEmail("a.b@com") // false
IsValidEmail("a@b.") // false
IsValidEmail("a [email protected]") // false
IsValidEmail("a@b c.com") // false
IsValidEmail("[email protected]") // true
IsValidEmail("[email protected]") // true
IsValidEmail("[email protected]") // true
IsValidEmail("[email protected]") // true
Il est censé être simple et ne traite donc pas de rares cas comme les e-mails avec des domaines entre crochets qui contiennent des espaces (généralement autorisés), les e-mails avec des adresses IPv6, etc.
la source
Voici une réponse à votre question à vérifier.
la source
Sur la base de la réponse de @Cogwheel, je souhaite partager une solution modifiée qui fonctionne pour SSIS et le "composant de script":
Placez ce code dans la bonne méthode:
Ensuite, vous pouvez utiliser un fractionnement conditionnel pour filtrer tous les enregistrements non valides ou tout ce que vous voulez faire.
la source