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