平台:
phpwind v5.3
采用SMTP模块、非
认证情况下发送
邮件不能成功
文件:require/sendemail.php Line:249
- if($M_db->smtp['auth']) {
- fwrite($fp,"EHLO phpwind\r\n");
- while($rt=strtolower(fgets($fp,512))){
- if(strpos($rt,"-")!==3 || empty($rt)){
- break;
- }elseif(strpos($rt,"2")!==0){
- return false;
- }
- }
- fwrite($fp, "AUTH LOGIN\r\n");
- if(substr(fgets($fp,512),0,3) != 334){
- return false;
- }
- fwrite($fp, base64_encode($M_db->smtp['user'])."\r\n");
- if(substr(fgets($fp,512),0,3) != 334){
- return false;
- }
- fwrite($fp, base64_encode($M_db->smtp['pass'])."\r\n");
- if(substr(fgets($fp,512),0,3) != 235){
- return false;
- }
- } else {
- fwrite($fp, "HELO phpwind\r\n");
- // while($rt=strtolower(fgets($fp,512))){
- // if(strpos($rt,"-")!==3 || empty($rt)){
- // break;
- // }elseif(strpos($rt,"2")!==0){
- // return false;
- // }
- // } //实际上跟 if 分支一样,这里为了方便描述,就copy了一遍
- }
注意上面注释的部分,源码中是没有的,这样导致在不需要认证的情况下,邮件无法发送成功。
其原因是,发送 cmd:HELO phpwind 后,没有等待邮件
服务器的response,就直接发送下一条命令。导致后面的程序在逻辑上出现了错误的判断,其实报文是正确的。
交互的报文如下:
- 220 mailserver.star-net.cn Microsoft ESMTP MAIL Service, Version: 6.0.3790.1830 ready at Tue, 28 Aug 2007 11:35:08 +0800
- HELO phpwind
- MAIL FROM: <[email]taoy11@star-net.cn[/email]>
- 250 mailserver.star-net.cn Hello [218.5.3.199]
- RCPT TO: <[email]taoy@star-net.cn[/email]>
- 250 2.1.0 [email]taoy11@star-net.cn[/email]....Sender OK
- DATA
- 250 2.1.5 [email]taoy@star-net.cn[/email]
- 354 Start mail input; end with <CRLF>.<CRLF>
可以看到,连续发送了两条命令,最后收到的
354响应没有得到正确的处理。
附件是wireshark抓到的报文。
[ 此贴被toyjoy1在2007-08-28 12:36重新编辑 ]