2011-07-13 89 views
0

我想創建一個應用程序發送電子郵件到smtp服務器。檢查郵件是否成功發送在VB.NET與SMTPClient

服務器未設置爲固定,但會根據電子郵件應發送到的電子郵件地址的域部分進行查找。

實施例:

郵件發送至:[email protected]

域的部分:stackoverflow.com

一個MX-記錄查找(命令行「NSLOOKUP型= MX計算器的結果。 COM「:

stackoverflow.com MX偏好= 30,郵件交換= stackoverflow.com.s9b1.psmtp.com stackoverflow.com MX偏好= 40,郵件交換= ST MX preference = 10,mail exchanger = stackoverflow.com.s9a1.psmtp.com stackoverflow.com MX preference = 20,mail exchanger = stackoverflow.com.s9a2.psmtp。 com

這將是非常有用的,知道郵件是否被郵件服務器接受,並且郵件已成功發送。

到目前爲止,我能夠通過使用System.Net.Mail.SMTPClient對象及其SendAsync函數獲取SMTP-Server錯誤代碼(如果出現錯誤(StatusCode 5xx)),如果出現錯誤,我會在SMTPClient的回調事件中獲得一個Exception-Object

我很清楚,並非每個郵件服務器都會告訴我mailaccount是否真的存在,然後拒絕帶有錯誤代碼的郵件,但是相反,只是接受郵件,然後刪除它。因此,我將不勝感激另一種方法來檢查郵件是否發送(注意:未讀取,這將是讀取確認)

最終目的是: 嘗試使用它的域名mailserver向收件人發送電子郵件,如果失敗,請根據錯誤代碼進行處理(用戶不存在 - > abort/mailserver未響應 - >使用其他郵件服務器(如果可用))。

在此先感謝(和錯別字:)對不起)

回答

2

你正在尋找不幸的是什麼,不存在。電子郵件跳過這麼多跳,沒有「發送」實際意義的定義。例如,您的stackoverflow示例實際上指向Postini的電子郵件服務器。 Postini可能會將電子郵件從網關傳遞到AV和路由器。從那裏他們要麼收集電子郵件,要麼將它們傳遞給另一個電子郵件服

對於電子郵件,「sent」的最接近的定義是「至少我沒有得到一個錯誤」。

此外,一個小問題,但是當使用nslookup記得添加一個尾隨句點到域中,否則使用域搜索列表。一般不會有什麼大不了的,但每過一段時間它都可能會讓你失望。

nslookup -type=mx stackoverflow.com. 
+0

hm。好的,所以我堅持把錯誤至少定義爲它不工作... – Nicholas

+0

是的,從程序員的角度來看,它非常令人沮喪,但想象一下垃圾郵件發送者可以用這些信息做些什麼。他們可以(並且確實)創建一個字母和數字組合的字典,並在每個可能的SMTP服務器上嘗試它們。那些被「發送」的是有效的,其餘的都是無效的。現在他們已經有了一個有效的電子郵件地址的純粹列表,每個SMTP管理員都在哭,因爲他們的機器正在被數百萬的SMTP請求所擊中。 –

+0

如果我在域中添加了一個尾隨時間段,與沒有相比的情況相比,究竟有什麼區別,爲什麼如果在沒有一個域名的情況下查看域名,會導致問題? – Nicholas