2010-03-11 9 views
6

Ich muss den Benutzernamen und das Passwort in einer SmtpClient Instanz vor dem Senden von E-Mails überprüfen. Mit diesem Code:Wie validiere ich die smtp-Zugangsdaten vor dem Mailversand?

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

Wie kann ich überprüfen, ob der Benutzer durch die Anmeldeinformationen identifiziert wird, erlaubt eine Verbindung und eine E-Mail schicken?

Antwort

3

Es gibt keine Möglichkeit.

SmtpClient kann das Benutzernamekennwort grundsätzlich nicht überprüfen, ohne den Server zu kontaktieren, mit dem es verbunden ist.

Sie können dies außerhalb von SmtpClient tun, indem Sie eine TCP-Verbindung zum Server öffnen ... aber die Authentifizierung kann je nach Konfiguration des Servers kompliziert sein.

Darf ich fragen, WARUM Sie vor dem Senden wissen müssen? normales Verhalten IMHO wäre es, das Senden in eine entsprechende Fehlerbehandlung einzubinden, um hier Ausnahmen abzufangen.

+0

ich brauchte, wenn zu wissen Validierung durchgeführt werden kann. Wie es in MS Outlook vor dem Senden von E-Mails passiert, fragt es nach Benutzername und Passwort, wenn es falsch ist. Ich wollte dasselbe in meiner Bewerbung machen. Ich schätze Ihre Hilfe. –

+0

Eigentlich hast du hier etwas falsch gemacht. MS Outlook fragt Sie nicht vor dem Senden von E-Mails.Es fragt Sie nur in einem Fall: Es kann nicht authentifizieren. Es versucht, wenn Sie passord festlegen. Es kann fragen, ob Sie es so konfiguriert haben. Aber es ist vollkommen glücklich, im Zweifel ohne Passwort zu versuchen. – TomTom

1

Bevor Sie überprüfen, ist das Senden von E-Mail mit der SMTP-Clientklasse in .net 2.0 nicht möglich.

Der Versuch, von Hand zu validieren, durch das Öffnen eines Ports ist so gut wie das Schreiben Ihres eigenen SMTP-Clients, es ist komplex.

1

. Net SmtpClient können Sie nicht anmelden, ohne eine Nachricht zu senden.

Sie können Anmeldeinformationen überprüfen, indem Sie eine Testnachricht an eine vorhandene Adresse senden, die eingehende E-Mails ignoriert und überprüft, ob eine Ausnahme vorliegt.

Beachten Sie, dass diese Test E-Mails in Ihrem Konto gesendet Ordner angezeigt wird, wenn überhaupt (zB Gmail)

0

ich mit den bisherigen Antworten zustimmen, dass SmtpClient nicht ohne Absenden überprüfen kann.

Aber vielleicht kann Ihr Problem trotzdem gelöst werden: Wenn Benutzername oder Passwort falsch sind, wird client.Send(mail); eine Ausnahme auslösen. Sie können eine while-Schleife und einen try-catch-Block um das Senden herum erstellen, die Ausnahme abfangen und den Benutzer nach dem korrekten Benutzernamen und Passwort fragen und es dann erneut versuchen. Wenn der Benutzer im Dialogfeld auf Abbrechen klickt oder das Senden ohne Ausnahme erfolgreich ist, beenden Sie die While-Schleife.

1

Try this:

try 
{ 
    smtpClient.Send(new MailMessage("[email protected]", "[email protected]", "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); 
} 

Es funktioniert für mich in meiner Validierungsmethode. Aber wenn Sie nur Anmeldeinformationen beim Senden von E-Mails überprüfen müssen, dann umschließen Sie Ihre Sendung mit try ... catch.

+0

Test.com ist eine echte Domain. Ich habe nicht überprüft, ob es einen MX-Eintrag gibt, aber jeder, der nur Ihr Code-Snippet kopiert, könnte seinen Mailserver veranlassen, echte E-Mails an test.com zu senden. Ich empfehle, dass Sie Ihr Beispiel mit einem Domänennamen bearbeiten, der wirklich nicht existiert (und wahrscheinlich nie existiert). – Christoph

2

Meine Produktionscode für Benutzername und Passwort Validierung vor dem Senden Mail:

public static bool ValidateCredentials(string login, string password, string server, int port, bool enableSsl) { 
     SmtpConnectorBase connector; 
     if (enableSsl) { 
      connector = new SmtpConnectorWithSsl(server, port); 
     } else { 
      connector = new SmtpConnectorWithoutSsl(server, port); 
     } 

     if (!connector.CheckResponse(220)) { 
      return false; 
     } 

     connector.SendData($"HELO {Dns.GetHostName()}{SmtpConnectorBase.EOF}"); 
     if (!connector.CheckResponse(250)) { 
      return false; 
     } 

     connector.SendData($"AUTH LOGIN{SmtpConnectorBase.EOF}"); 
     if (!connector.CheckResponse(334)) { 
      return false; 
     } 

     connector.SendData(Convert.ToBase64String(Encoding.UTF8.GetBytes($"{login}")) + SmtpConnectorBase.EOF); 
     if (!connector.CheckResponse(334)) { 
      return false; 
     } 

     connector.SendData(Convert.ToBase64String(Encoding.UTF8.GetBytes($"{password}")) + SmtpConnectorBase.EOF); 
     if (!connector.CheckResponse(235)) { 
      return false; 
     } 

     return true; 
    } 

Weitere Details in der Antwort auf eine similar question.

Code on github

+0

Jetzt benutze ich Lib MimeKit. Arbeite mit jeder Art von Auth. Und funktioniert gut in meiner Produktion. http://www.mimekit.net/ –