2010-03-11 166 views
6

我需要在發送郵件之前驗證在SmtpClient實例中設置的用戶名和密碼。使用此代碼:如何在發送郵件之前驗證smtp憑證?

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

我如何可以驗證通過憑據確定用戶是否被允許連接和發送郵件?

回答

3

沒有辦法。

SmtpClient基本上無法驗證用戶名密碼,而無需聯繫它連接的服務器。

你可以做的是在SmtpClient之外通過打開一個到服務器的TCP連接來完成它......但是根據服務器的配置方式,認證可能會變得很複雜。

我可以問你爲什麼在發送之前需要知道嗎?正常的行爲恕我直言,將包裝發送適當的錯誤處理在這裏捕捉異常。

+0

我需要知道是否可以進行驗證。正如MS Outlook中發生的那樣,在發送郵件之前,如果它錯了,它會詢問用戶名和密碼。我想在我的應用程序中做同樣的事情。 我感謝您的幫助。 –

+0

其實你在這裏弄錯了。 MS Outlook在發送電子郵件之前不會問你。它僅僅以1次的方式詢問你:它無法驗證。它會嘗試,如果你設置passord。它可能會問你是否配置它。但如果有疑問,嘗試不加密碼是非常高興的。 – TomTom

1

之前進行驗證,使用.net 2.0中的SMTP客戶端類不能發送郵件。

試圖手動驗證,通過打開一個端口和編寫自己的SMTP客戶端一樣好,這很複雜。

1

.Net's SmtpClient不允許您在未發送郵件的情況下登錄。

您可以通過向某個現有地址發送測試消息來檢查憑據,該地址會忽略傳入的電子郵件並檢查是否收到異常。

注意,這些測試的電子郵件將顯示在您的帳戶發送的文件夾中,如果有的話(例如Gmail帳戶)

0

我與以前的答案同意,SmtpClient不能沒有發送驗證。

但也許你的問題可以解決:如果用戶名或密碼錯誤,client.Send(mail);會拋出異常。您可以在發送周圍建立一個while-loop和try-catch-block,捕獲異常並詢問用戶輸入正確的用戶名和密碼,然後重試。如果用戶點擊對話框上的取消或發送成功,您將退出while循環。

1

試試這個:

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

它爲我在我的驗證方法。但是,如果您只需檢查發送電子郵件的憑據,那麼只需使用try ... catch將您的發送包圍即可。

+0

Test.com是一個真正的域名。我沒有檢查它是否有MX記錄,但任何只複製代碼段的人都可能會讓他們的郵件服務器嘗試將真實電子郵件發送到test.com。我建議你用一個真正不存在的域名編輯你的例子(並且可能永遠不會存在)。 – Christoph

2

我對之前發送郵件的用戶名和密碼驗證產品代碼:

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

更多細節在回答一個similar question

Code on github

+0

現在我正在使用lib MimeKit。使用任何類型的身份驗證。並且在我的製作中工作得很好。 http://www.mimekit.net/ –

相關問題