8
votes

Comment valider les informations d'identification SMTP avant d'envoyer du courrier?

Je dois valider le nom d'utilisateur et le mot de passe défini dans une instance code> SMTPClient CODE> avant d'envoyer le courrier. Utilisation de ce code:

SmtpClient client = new SmtpClient(host);
client.Credentials = new NetworkCredential(username,password);
client.UseDefaultCredentials = false;

// Here I need to verify the credentials(i.e. username and password)
client.Send(mail);


0 commentaires

6 Réponses :


3
votes

Il n'y a aucun moyen.

smtpclient de manière bascielle ne peut pas valider le nom d'utilisateurApassword sans contacter le service qu'il se connecte à.

Ce que vous pouviez faire est de le faire à l'extérieur SMTPClient, en ouvrant une connexion TCP au serveur ... mais l'authentification peut être compliquée en fonction de la configuration du serveur.

Puis-je vous demander pourquoi vous devez savoir que avant d'envoyer? Comportement normal L'IMHO serait d'envelopper l'envoi dans la manipulation des erreurs appropriée pour attraper des exceptions ici.


3 commentaires

Je devais savoir si la validation peut être faite. Comme cela se produit dans MS Outlook qui avant d'envoyer des mails, il demande le nom d'utilisateur et le mot de passe s'il est faux. Je voulais faire la même chose dans mon application. J'apprécie ton aide.


En fait, vous obtenez quelque chose de mal ici. MS Outlook ne vous demande pas avant d'envoyer des emails. Il ne vous demande que dans 1 oncurance: il ne peut pas s'authentifier. Il essaie si vous définissez le passord. Cela peut demander si vous avez configuré cela pour le faire. Mais il est parfaitement heureux d'essayer sans mot de passe en doute.


J'utilise HealtChecks, il vous aidera à afficher si le service est correctement configuré et que le service est disponible.



1
votes

Valider avant, l'envoi de courrier n'est pas possible avec la classe client SMTP dans .NET 2.0.

Tentative de valider à la main en ouvrant un port est aussi bon que d'écrire votre propre client SMTP, il est complexe.


0 commentaires

1
votes

.net's smtpclient ne vous permet pas de vous connecter sans envoyer de message.

Vous pouvez vérifier les informations d'identification en envoyant un message de test à une adresse existante qui ignore le courrier électronique entrant et en vérifiant si vous obtenez une exception.

Notez que ces e-mails de test apparaîtront dans le dossier envoyé de votre compte, le cas échéant (par exemple, gmail)


0 commentaires

0
votes

Je suis d'accord avec les réponses précédentes, que SmtpClient ne peut pas valider sans envoi.

Mais peut-être que votre problème peut être résolu de toute façon: si le nom d'utilisateur ou le mot de passe est incorrect, client.send (mail); lancera une exception. Vous pouvez construire une boucle de temps et un bloc-catch sur l'envoi, attirer l'exception et demander à l'utilisateur le nom d'utilisateur et le mot de passe corrects, puis réessayez. Si l'utilisateur clique sur Annuler sur la boîte de dialogue ou que l'envoi réussit sans exception, vous quittez la boucle tandis que la boucle.


0 commentaires

0
votes

Essayez ceci:

try
{
   smtpClient.Send(new MailMessage("test@test.com", "test@test.com", "test", "test"));
   return string.Empty;
}
catch (SmtpFailedRecipientException)
{
   return string.Empty;
}
catch (Exception ex)
{
   return string.Format("SMTP server connection test failed: {0}", ex.InnerException != null ? ex.InnerException.Message : ex.Message);
}


1 commentaires

Test.com est un vrai domaine. Je n'ai pas vérifié s'il a un enregistrement MX, mais quiconque qui vient de copie votre code de code pourrait entraîner un serveur de courrier pour tenter d'envoyer des courriels réels à Test.com. Je vous recommande de modifier votre exemple avec un nom de domaine qui n'existe vraiment pas (et n'existera probablement jamais).



3
votes

Mon code de production pour la validation du nom d'utilisateur et du mot de passe avant d'envoyer la messagerie: xxx

Plus de détails dans la réponse à un question similaire .

code sur github


1 commentaires

Maintenant j'utilise lib mimekit. Travailler avec tout type d'auth. Et fonctionne bien dans ma production. mimekit.net