天天看點

如何編寫SMTP郵件伺服器

如何編寫SMTP郵件伺服器

  許多時候,我想不通為什麼不能直接将信件送到對方(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