Quel est le code le plus élégant pour valider qu'une chaîne de caractères est une adresse électronique valide ?
Je ne pense pas que cela fonctionne. je viens d'essayer avec simplement a@a et cela renvoie vrai. c'est faux.
Quel est le code le plus élégant pour valider qu'une chaîne de caractères est une adresse électronique valide ?
Et ça ?
bool IsValidEmail(string email)
{
try {
var addr = new System.Net.Mail.MailAddress(email);
return addr.Address == email;
}
catch {
return false;
}
}
Selon le commentaire de Stuart, ceci compare l'adresse finale avec la chaîne de caractères originale au lieu de toujours retourner vrai. MailAddress essaie d'analyser une chaîne de caractères avec des espaces dans les parties "Display Name" et "Address", donc la version originale retournait des faux positifs.
Pour clarifier, la question est de savoir si une chaîne particulière est une représentation valide d'une adresse électronique, et non si une adresse électronique 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 électroniques sont plus indulgentes que vous ne le pensez. Toutes ces formes sont parfaitement valables :
Dans la plupart des cas, un faux "invalide" est bien pire pour vos utilisateurs et pour l'avenir qu'un faux "valide". Voici un exemple article qui était autrefois la réponse acceptée à cette question (cette réponse a depuis été supprimée). Elle contient beaucoup plus de détails et d'autres idées sur la façon de résoudre le problème.
La mise en place de contrôles d'intégrité reste une bonne idée pour l'expérience utilisateur. En supposant que l'adresse électronique est valide, vous pourriez rechercher les domaines de premier niveau connus, vérifier si le domaine possède un enregistrement MX, vérifier les erreurs d'orthographe des noms de domaine courants (gmail.cmo), etc. Puis présenter un avertissement donnant à l'utilisateur une chance de dire "oui, mon serveur de messagerie l'autorise vraiment comme adresse électronique".
Quant à l'utilisation du traitement des exceptions pour la logique métier, je suis d'accord pour dire 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.
En outre, si vous faites quoi que ce soit d'autre avec l'adresse électronique, cela impliquera probablement de la transformer en une MailAddress. Même si vous n'utilisez pas cette fonction exacte, vous voudrez probablement utiliser le même modèle. Vous pouvez également vérifier l'existence de types d'échec spécifiques en attrapant différentes exceptions : format nul, vide ou invalide.
--- Autres lectures ---
Documentation pour System.Net.Mail.MailAddress
Explication de ce qui constitue une adresse électronique valide
Je ne pense pas que cela fonctionne. je viens d'essayer avec simplement a@a et cela renvoie vrai. c'est faux.
En fait, ce n'est pas incorrect. a@a est une adresse électronique valide. Voir haacked.com/archive/2007/08/21/ En fait, cette méthode renvoie des résultats incorrects si vous utilisez une adresse avec des guillemets.
+1 : C'est la meilleure réponse si vous utilisez l'option System.Net.Mail
pour envoyer du courrier, ce que vous faites probablement si vous utilisez .NET. Nous avons pris la décision d'utiliser ce type de validation simplement parce qu'il n'y a aucun intérêt à accepter des adresses électroniques - même valides - auxquelles nous ne pouvons pas envoyer de courrier.
Il s'agit d'une vieille question, mais toutes les réponses que j'ai trouvées sur SO, y compris les plus récentes, sont similaires à celle-ci. Cependant, dans .Net 4.5 / MVC 4, vous pouvez ajouter la validation d'une adresse e-mail à un formulaire en ajoutant l'annotation [EmailAddress] de System.ComponentModel.DataAnnotations. Je me demandais donc 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 :
using System.ComponentModel.DataAnnotations;
class ValidateSomeEmails
{
static void Main(string[] args)
{
var foo = new EmailAddressAttribute();
bool bar;
bar = foo.IsValid("someone@somewhere.com"); //true
bar = foo.IsValid("someone@somewhere.co.uk"); //true
bar = foo.IsValid("someone+tag@somewhere.net"); //true
bar = foo.IsValid("futureTLD@somewhere.fooo"); //true
bar = foo.IsValid("fdsa"); //false
bar = foo.IsValid("fdsa@"); //false
bar = foo.IsValid("fdsa@fdsa"); //false
bar = foo.IsValid("fdsa@fdsa."); //false
//one-liner
if (new EmailAddressAttribute().IsValid("someone@somewhere.com"))
bar = true;
}
}
Cool, même si c'est décevant que MS ne puisse pas le faire correspondre avec leur propre documentation . Cela rejette js@proseware.com9
Si vous utilisez [EmailAddress] dans votre modèle de vue (comme je le fais), c'est un moyen astucieux de vous assurer que vous utilisez la même logique de validation - pour le meilleur ou pour le pire - dans votre code.
Jetez un coup d'œil à l'article de Phil Haack : " Je savais comment valider une adresse e-mail jusqu'à ce que je lise la RFC. "
J'ai pris la réponse de Phil au point 1 et j'ai créé cette classe. Appelez-la comme ceci : bool isValid = Validator.EmailIsValid(emailString);
Voici la classe :
using System.Text.RegularExpressions;
public static class Validator
{
static Regex ValidEmailRegex = CreateValidEmailRegex();
/// <summary>
/// Taken from http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx
/// </summary>
/// <returns></returns>
private static Regex CreateValidEmailRegex()
{
string validEmailPattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"
+ @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"
+ @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";
return new Regex(validEmailPattern, RegexOptions.IgnoreCase);
}
internal static bool EmailIsValid(string emailAddress)
{
bool isValid = ValidEmailRegex.IsMatch(emailAddress);
return isValid;
}
}
Juste une petite, mais j'utiliserais : return (!string.IsNullOrEmpty(emailAddress)) && ValidEmailRegex.IsMatch(emailAddress) ;
Personnellement, je dirais que vous devriez juste vous assurer qu'il y a un symbole @ là-dedans, avec éventuellement un caractère . Il existe de nombreuses regex plus ou moins correctes que vous pouvez utiliser, mais je pense que la plupart d'entre elles ne prennent pas en compte les adresses électroniques valides ou laissent passer celles qui ne le sont pas. Si les gens veulent mettre une fausse adresse électronique, ils le feront. Si vous devez vérifier que l'adresse électronique est légitime et que la personne qui l'utilise en a le contrôle, vous devrez lui envoyer un courrier électronique contenant un lien codé spécial afin qu'elle puisse vérifier qu'il s'agit bien d'une adresse réelle.
Je pense personnellement que vous devriez faire un peu plus de validation que cela. Quelqu'un va forcément essayer l'adresse e-mail de Bobby Table ou pire.
Quel est le problème avec l'adresse e-mail de Bobby Table si vous utilisez des déclarations préparées. Nous parlons d'adresses électroniques valides, pas d'autres choses qui n'ont rien à voir avec ce qui constitue une adresse électronique valide, comme la façon de faire correctement des requêtes SQL pour ne pas avoir de problèmes d'injection SQL.
Je suppose que vous ne savez pas ce que quelqu'un va y mettre, mais une personne malveillante sait que cette valeur peut éventuellement être introduite dans votre système de messagerie. Je préfèrerais simplement une défense en profondeur et être un peu plus strict.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
10 votes
expressions-régulières.info/email.html
10 votes
Jetez un coup d'œil à l'article de Phil Haack : " Je savais comment valider une adresse e-mail jusqu'à ce que je lise la RFC. "
0 votes
Il y a beaucoup d'autres validations importantes qui ne se limitent pas à la chaîne de caractères, il est préférable de vérifier si l'email existe sur ce serveur smtp ou si l'utilisateur saisit un email etc. ou d'utiliser une API qui s'en chargera pour vous afin d'être sûr que l'email est correct, par exemple ver-email.com
0 votes
Meilleur lnk de microsoft docs.microsoft.com/fr/us/dotnet/standard/base-types/
0 votes
Vous pourriez utiliser github.com/jstedfast/EmailValidation bibliothèque.