在日常工具開發中,經常會有發送郵件的需求。在一些高級語言中,如Python,C#中,都有專門的郵件發送模塊,如Python 中的 smtplib 模塊。那麼,一封郵件到底是如何發送到一個特定的郵箱呢?
舉個例子:使用[email protected] 發送一封郵件到 [email protected]。
首先,看下郵件系統的組成部分,如下圖
再看下郵件發送的整個過程,如下圖:
①發送者使用SMTP協議,將郵件發送到自己郵箱服務器
②163郵件服務器使用SMTP協議,將郵件發送到QQ郵件服務器
③收件人使用POP3協議,從服務器端讀取郵件
在上面過程中我們會發現兩個問題:
①163郵件服務器需要驗證發送方是否是合法用戶。也就是說在整個發送過程中,需要使用到[email protected]的密碼才能完成整個郵件發送過程。
②163郵件服務器如何發送郵件到QQ郵件服務器的呢?其實,這中間有個域名解析的過程。發送方會根據收件人的信箱來解析其服務器域名(qq.com),在該解析過程中,詢問其郵件服務器的地址。
既然驗證過程是在163郵件服務器,那麼我們是不是可以直接繞過去,直接模擬請求跟QQ郵件服務器進行交互呢?答案是肯定的,而郵件發送的整個過程可以抽象成下圖
我們可以發現關鍵的地方是如何解析QQ郵件服務器的地址。此處我們使用Windows命令nslookup來進行域名解析。查看qq.com的郵件服務器地址,可以使用命令:nslookup -qt=mx qq.com,結果如下:
其中 mail exchanger 後面就是qq.com 的郵件服務器地址。
這樣,我們就繞過了密碼驗證的過程,將郵件直接發送到了收件人的郵件服務器,想要了解代碼如何實現,點擊“閱讀原文”查看更多內容~