2009-11-28 1 views
3

J'ai remarqué que si vous essayez d'envoyer un e-mail à une adresse non valide, une exception est levée:Dans asp.net existe-t-il une fonction pour valider une adresse e-mail?

MailAddress To=new MailAddress("invalidemailaddress","recipientname"); 

lancers francs:

"The specified string is not in the form required for an e-mail address" 

Cela signifie qu'il doit y avoir une fonction .Net qui est exécuté dans MailAddress pour vérifier si l'adresse e-mail est valide ou non. Y a-t-il un moyen d'appeler cette fonction 'valider' directement? De cette façon, je n'aurai pas besoin de créer ma propre fonction IsValid.

Répondre

2

Oui, il y a une telle fonction .Net, mais sa fonctionnalité est par unaccessible « standard » signifie: MailAdress utilise une méthode ParseAddress privée, qui à son tour utilise System.Net.Mime.MailBnfHelper. Ce dernier est une classe internal, donc il n'est pas (facilement) accessible en dehors du cadre lui-même. Ainsi, la seule façon d'utiliser ces fonctions serait d'utiliser la réflexion, ce que je déconseille vivement. Étant donné que ces fonctions sont non documentées et inaccessibles sans réflexion, leur implémentation peut changer et votre code risque de se rompre dans les futures versions du framework.

9

Non, mais vous pouvez faire un:

public bool ValidateEmailAddress (string email) 
{ 
    if (string.IsNullOrEmpty (email)) return false; 

    try 
    { 
     MailAddress to = new MailAddress (email); 

     return true; 
    } 
    catch (WhateverException e) 
    { 
     return false; 
    } 
} 

Answering commentaires. Je suis conscient que cette technique est considérée comme mauvaise et avec raison. Ce que je voudrais souligner, c'est que cette approche vous donnera 100% de garantie que la bibliothèque de messagerie .NET sera en mesure d'envoyer à une adresse validée récemment. Le problème avec les expressions rationnelles (qui sont nombreuses) est que chacune d'elles aborde un sous-ensemble particulier de l'ensemble des adresses techniquement correctes selon la spécification. L'un serait plus étroit, l'autre plus large que le sous-ensemble défini en interne dans .NET. Si vous utilisiez la validation Regex, alors dans le premier cas votre Regex couperait une partie des adresses valides (comme vu par .NET), dans le dernier cas, la validaton laissera passer les adresses que la bibliothèque de mail .NET a gagnées ' t traiter comme invalide par sa propre validation interne. La seule façon de s'assurer que votre jeu valide 100% correspond à l'ensemble .NET (ou à toute autre bibliothèque tierce que vous utiliseriez) est de tomber dans l'approche try/catch, à moins bien sûr que cette bibliothèque tierce offre une méthode de validation déjà.

+0

Ouch. Gestion des exceptions comme contrôle de flux :( – Oded

+2

Oui, c'est mauvais, je sais, mais c'est simple et ça fonctionne –

+2

De toutes les choses que vous ne devriez pas faire, mais cela ne pose aucun problème dans la pratique – erikkallen

0

Malheureusement, il n'y a malheureusement aucun moyen d'obtenir cette fonctionnalité sans avoir recours à l'ingénierie inverse ou à l'utilisation de cette exception spécifique.

La manière traditionnelle de valider une adresse e-mail a toujours été avec des expressions régulières, mais il y a des longueurs, vous pouvez aller au-delà pour valider des e-mails encore plus loin, si vous le souhaitez:

The Forgotten Art of Email Address Validation

1

Il y a bon exemple d'une validation par courriel function on CodeProject.

original code source écrit par Vasudevan Deepak Kumar:

public static bool isEmail(string inputEmail) 
{ 
    inputEmail = NulltoString(inputEmail); 
    string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" + 
     @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" + 
     @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"; 

    Regex re = new Regex(strRegex); 

    if (re.IsMatch(inputEmail)) 
    return (true); 
    else 
    return (false); 
} 
+1

Malheureusement, ces validations Regex ne sont pas très utiles dans certaines circonstances.Si vous avez l'intention d'envoyer des mails avec la bibliothèque de mail .NET, vous voulez être sûr que votre validation fonctionne exactement comme celle de la bibliothèque. Soit votre validation coupe une adresse bien formatée, soit elle laisse passer des adresses que l'expéditeur .NET ne peut pas gérer. st pour le garder à l'esprit. –

0

Vous pouvez écrire votre propre classe:

class EmailAddress 
{ 
    private MailAddress _email; 

    public string Address 
    { 
    get 
    { 
     return _email == null ? string.Empty : _email.Address; 
    } 
    } 

    public string DisplayName 
    { 
    get 
    { 
     return _email == null ? string.Empty : _email.DisplayName; 
    } 
    } 

    public string Host 
    { 
    get 
    { 
     return _email == null ? string.Empty : _email.Host; 
    } 
    } 

    public string User 
    { 
    get 
    { 
     return _email == null ? string.Empty : _email.User; 
    } 
    } 

    public EmailAddress(string email) 
    { 
    try { 
     _email = new MailAddress(email); 
    } 
    catch (Exception) { 
     _email = null; 
    } 
    } 

    public EmailAddress(string email, string displayName) 
    { 
    try { 
     _email = new MailAddress(email, displayName); 
    } 
    catch (Exception) { 
     _email = null; 
    } 
    } 

    public EmailAddress(string email, string displayName, Encoding displayNameEncoding) 
    { 
    try { 
     _email = new MailAddress(email, displayName, displayNameEncoding); 
    } 
    catch (Exception) { 
     _email = null; 
    } 
    } 

    public bool IsValid() 
    { 
    return _email == null ? false : true; 
    } 

    public override string ToString() 
    { 
    return this.Address; 
    } 
} 

Maintenant, vous l'utilisez comme MailAddress mais il n'y a maintenant aucune exception lorsque l'adresse e-mail est pas valide. Au lieu de cela vous appelez la méthode IsValid:

var email = new EmailAddress("[email protected]"); 
if (email.IsValid()) { 
    ... 
} 
else { 
    ... 
} 
Questions connexes