許多時候,我想不通為什麼不能直接將信件送到對方(POP或IMAP)服務器上,為什麼非要通過一個莫名其妙的SMTP郵件服務器轉交一次,實在不服氣,如果使用UNIX,這個問題就很好解決,用sendmail就能完成遞送任務,但在Windows下呢?同樣的,一定也有辦法饒開SMTP Server直接遞送到對方的遠程郵局服務器上,難得住別人,難得住我們程序員嗎?分析相關協議(RFC2645,RFC821, RFC1846,RFC1939,RFC1725,RFC1730-RFC1733 etc.),我們會知道要完成直接遞送其實相當簡單。
首先我們看一下Email的遞送過程:Email(Encode) -> a SMTP Relay Server -> Remote SMTP Server(遠程郵局)。非常簡單,郵件編碼後被遞送到一個SMTP轉交服務器上,該服務器對信件分檢(到同一郵局的被放在一起)後,根據優先級以及信件的先後次序被發送到遠程郵局的SMTP服務器上。換句話說,只要我們知道了SMTP轉交服務器是如何確定遠程郵局SMTP服務器的地址的,就可以輕松地將饒開SMTP Relay Server直接遞送到遠程郵局服務器。
SMTP Relay Server是如何確定遠程郵局服務器的地址的呢?如果你熟悉域名解析,就知道是怎麼回事了,我們知道電子郵件的地址由兩部分構成
[email protected],郵箱(postbox)和地址(address.com),給域名服務器發送指令查詢“address.com”的遠程郵局服務器的地址即可找到遠程郵局SMTP服務器的IP 地址,該指令查詢是被稱作MX(Mail Exchange)郵件交換服務器的地址查詢。遠程郵局SMTP服務器的地址可能不止一個,這時,你可根據信件優先級的不同,將對應優先級的信件發到對應地址的遠程郵局SMTP服務器,當然,你也可以不管三七二十一,隨便選一個SMTP服務器發送,見後附“域名解析結果樣例”。簡單吧。這下,自己編寫一個SMTP Server不難了吧!
問題:頭ID是個麻煩的事,有時會產生Invalid Head ID 5811的錯誤。
附:域名解析結果樣例
Answer List
Resource name is : sina.com
Type is : MX Class is : IN
MX Priority : 10 MX Server : mailcn.sina.com
Resource name is : sina.com
Type is : MX Class is : IN
MX Priority : 15 MX Server : mail.sina.com.cn
Authority List
Resource name is : sina.com
Type is : NS Class is : IN
Domain name is : resolver.sina.com
Resource name is : sina.com
Type is : NS Class is : IN
Domain name is : ns2.sina.com
Additional Response List
Resource name is : mailcn.sina.com
Type is : A Class is : IN
IP Address is : 202.106.184.233
Resource name is : mail.sina.com.cn
Type is : A Class is : IN
IP Address is : 202.106.187.150
Resource name is : resolver.sina.com
Type is : A Class is : IN
IP Address is : 206.204.114.135
Resource name is : ns2.sina.com
Type is : A Class is : IN
IP Address is : 209.133.24.135