SMTP的服务和Telnet服务的结合,使我们对网络的管理更加便利。如今不少企业的网络都采用了这样的形式。但是最近我们的网友常会问到telnet smtp 535 Error的相关错误。今天我们就来讲解一下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的问题。