telnet smtp的錯誤分析以及處理
SMTP的服務和Telnet服務的結合,使我們對網(wǎng)絡的管理更加便利。如今不少企業(yè)的網(wǎng)絡都采用了這樣的形式。但是最近我們的網(wǎng)友常會問到telnet smtp 535 Error的相關錯誤。今天我們就來講解一下telnet smtp 535 Error的錯誤內(nèi)容和解決方法。通過telnet smtp服務器的25端口檢查smtp服務器是否可用,或用程序采用socket通訊的方法與smtp服務器直接交互,往往在驗證用戶的時候出現(xiàn)這樣的錯誤提示535 Error: authentication failed
這是因為當服務器要求客戶端輸入帳號,密碼時必須是經(jīng)過base64碼轉(zhuǎn)換的.有的人也轉(zhuǎn)換了,但不知道為什么還出這種問題,實際上是因為你的轉(zhuǎn)換沒有成功.這種失敗用.net socket編程時就比較多見.而用php作為工具進行轉(zhuǎn)換就容易成功.筆者作過試驗,在.net中,由于沒有現(xiàn)成的Base64編碼函數(shù),于是從網(wǎng)上下了一個函數(shù),用此函數(shù)對郵箱帳號,密碼進行編碼,在php中,有一個函數(shù)base64_encode() 可以直接調(diào)用,用php的函數(shù)直接對郵箱帳號,密碼進行編碼。結果發(fā)現(xiàn)兩種結果不一樣,主要體現(xiàn)在對帳號的上,這兩種方式對后綴@163.com 編碼效果就不一樣,***用telnet作測試,發(fā)現(xiàn)用php自帶的base64_encode() 編碼的結果是正確的.
這里還要提到兩個有趣的現(xiàn)象:
1.很多人認為用telnet 25 或socket 通訊的方式與smtp服務器交互,可以確認某個郵件帳號是否存在,例如輸入想要測試的郵箱帳號,再隨便輸個密碼,希望服務器返回帳號密碼錯誤的信息,以確認郵箱的確存在.但實際上這種方法多數(shù)情況下是不行的.因為即使帳號存在,密碼錯誤,或帳號錯誤返回的信息都是一樣的,都是:telnet smtp 535 Error: authentication failed.從而無法判斷.
2.另一個是php和.net語法的的比較.php的確比.net語法上簡單多了.
例如要實現(xiàn)socket通訊,
.net 的語法是:
建立連接:
TcpCliet client = new TcpClient(server,port);
NetWorkStream stream = client.GetStream();
發(fā)送數(shù)據(jù):
byte[] arrayToSend=System.Text.Encoding.Default.GetBytes(stringToSend.ToCharArray());
stream.Write(arrayToSend,0,arrayToSend.Length);
得到數(shù)據(jù):
int len = stream.Read(bb,0,bb.Length);
string read=System.Text.Encoding.UTF8.GetString(bb);
string result= read.Substring(0, len);
php就一句,類似:
建立連接
$fp=fsockopen ( $this->smtp, 25, $errno, $errstr, 60);
發(fā)送數(shù)據(jù)
fputs($fp, $lastact);
取數(shù)據(jù)
$lastmessage == fgets($fp,512);
再如要實現(xiàn)字符串轉(zhuǎn)換為base64格式
.net
沒現(xiàn)成的(可能是我不知道),還要從網(wǎng)上下一個函數(shù),編譯到自己的工程中.
php
提供了base64_encode() 搞定.其實這也體現(xiàn)了.net的確比較嚴謹,主要是對類,類型轉(zhuǎn)換很嚴格,但的確是麻煩,也不好記.希望以上的方法,能夠幫助大家解決telnet smtp 535 Error的問題。