614 votes

Code C# pour valider l'adresse e-mail

Quel est le code le plus élégant pour valider qu'une chaîne de caractères est une adresse électronique valide ?

10 votes

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

1022voto

Cogwheel Points 8656

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 :

  • cog@wheel
  • "roue dentée l'orange"@example.com
  • 123@$.xyz

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

12 votes

Je ne pense pas que cela fonctionne. je viens d'essayer avec simplement a@a et cela renvoie vrai. c'est faux.

25 votes

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.

58 votes

+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.

313voto

imjosh Points 579

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;    
    }
}

1 votes

Il semble que la fermeture ) soit manquante dans l'exemple d'une ligne simple.

5 votes

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

3 votes

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.

64voto

Luke Quinane Points 8257

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. "

47voto

David Silva Smith Points 3350

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;
    }
}

5 votes

Juste une petite, mais j'utiliserais : return (!string.IsNullOrEmpty(emailAddress)) && ValidEmailRegex.IsMatch(emailAddress) ;

1 votes

C'est juste de l'horreur :)

0 votes

Ceci ne validera pas les e-mails avec un domaine à un caractère, par exemple : bla@a.com.

37voto

Kibbee Points 36474

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.

6 votes

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.

33 votes

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.

0 votes

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.com

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.

Powered by:

X