以前的smtp服務器大多都支持匿名郵件的發送,因此我們只要用Winsock連上服務器25端口,然後再發送幾個命令和郵件的相關信息,就能實現發送E-mail了(現在從網上下載的許多關於VB發送電子郵件的例子都是通過這種匿名的方式)。但是現在支持匿名發送電子郵件的Smtp幾乎沒有了(誰知道,請告訴我一個),現在的Smtp都需要身份驗證(ESmtp),下面我就說一下用Winsock實現ESmtp的幾個步驟:
步驟/方法
設置Winsock控件的通信協議(TCP),遠程主機ip,遠程連接端口(通常為25)。然後連接遠程主機。 eg, Winsock1.Protocol = sckTCPProtocol
Winsock1.RemoteHost = "smtp.126.com"
Winsock1.RemotePort = 25
Winsock1.Connect
如果winsock接受到的服務器的迴應碼為220,表明服務器端接受了客護端的連接請求。這樣可以進行下一步的通信:客戶端發送EHLO消息,該消息表示客戶希望基於ESMTP協議的電子郵件傳遞。
eg, winsock1.senddata("EHLO xiaopeng"+vbcrlf)
如果winsock接受到服務器的迴應碼為250,表明服務器接受了客戶端的通過ESMTP發送郵件的請求。
這樣可以進行下一步的通信:客戶端發送AUTH LOGIN消息。
eg, winsock1.senddata("AUTH LOGIN"+vbcrlf)
如果winsock接收到服務器的迴應碼為334,表明服務器啟動了一個認證過程。下一步期待用戶輸入用戶名 。
eg, winsock1.senddata(Encode64("username")+vbcrlf)
如果winsock接收到服務器的迴應碼為334,表明服務器已經接受了用戶名,下一步期待用戶輸入密碼。
eg,winsoc1.senddata(Encode64("password")+vbcrlf)
如果winsock接收到服務器的迴應碼為235,表明認證成功完成。接著客戶就可以發郵件了。
發郵件具體過程如下:
(1)客戶端發送"mail from:"消息,該消息包含了發送人的email
eg, winsock1.sendata("mail from:"+chr(32)+"[email protected]"+vbcrlf)
(2)當客戶端接收到250,則繼續發送"rcpt to:"消息,它包含了收件人的郵件地址。
eg, winsock1.senddata("rcpt to:"+chr(32)+"[email protected]"+vbcrlf)
(3)當客戶端接收到250,則繼續發送“data”消息,它通知郵件服務器隨後客戶斷將發送電子郵件數據。
eg, winsock1.senddata("data"+vbcrlf)
(4)客戶端如果接收到354的消息,客戶端將發送電子郵件數據。電子郵件的數據包括以下字段:
Date,From,To,X-Mailer以及郵件正文。電子郵件以"."結束。
eg,winsock1.senddata("Date:"+chr(32)+format(Date,"Ddd")&","&format(Date,"dd Mmm YYYY")&""&format(Time,"hh:mm:ss")&""&"-0600"+vbcrlf)
winsock1.senddata("From:"+chr(32)+"xiaopeng"+vbcrlf)
winsock1.senddata("X-Mailer: vbemailsender"+vbcrlf)
winsock1.senddata("To:"+chr(32)+"lingling"+vbcrlf)
winsock1.senddata("Subject:"+chr(32)+"how are you"+vbcrlf)
winsock1.sendtada("ni hao ma"+vbcrlf)
winsock1.senddata("."+vbcrlf)
(5)如果客戶端接收到250的消息,表明電子郵件數據被成功發送。此時客戶端如果希望與服務器斷開連接,發送"quit"消息即可。如果客戶端接收到221的消息,表明服務器已經終止了基於ESMTP協議的連接。
eg, winsock1.senddata("quit"+vbcrlf)
需要說明的地方:
Encode64 這是一個用於Base64編碼的函數(關於函數的功能以及為什麼要進行Base64編碼大家可以到網上查),至於算法,說實話,我也再找(希望有人能提供)...