论坛风格切换切换到宽版
  • 1934阅读
  • 1回复

[讨论]邮件bug及其解决方法 [复制链接]

上一主题 下一主题
离线toyjoy1
 
发帖
7
金钱
175
威望
8
只看楼主 倒序阅读 使用道具 楼主  发表于: 2007-08-28
平台: phpwind v5.3
采用SMTP模块、非认证情况下发送邮件不能成功
文件:require/sendemail.php Line:249
  1.         if($M_db->smtp['auth']) {
  2.             fwrite($fp,"EHLO phpwind\r\n");
  3.             while($rt=strtolower(fgets($fp,512))){
  4.                 if(strpos($rt,"-")!==3 || empty($rt)){
  5.                     break;
  6.                 }elseif(strpos($rt,"2")!==0){
  7.                     return false;
  8.                 }
  9.             }
  10.             fwrite($fp, "AUTH LOGIN\r\n");
  11.             if(substr(fgets($fp,512),0,3) != 334){
  12.                 return false;
  13.             }
  14.             fwrite($fp, base64_encode($M_db->smtp['user'])."\r\n");
  15.             if(substr(fgets($fp,512),0,3) != 334){
  16.                 return false;
  17.             }
  18.             fwrite($fp, base64_encode($M_db->smtp['pass'])."\r\n");
  19.             if(substr(fgets($fp,512),0,3) != 235){
  20.                 return false;
  21.             }
  22.         } else {
  23.             fwrite($fp, "HELO phpwind\r\n");
  24. //            while($rt=strtolower(fgets($fp,512))){
  25. //              if(strpos($rt,"-")!==3 || empty($rt)){
  26. //                    break;
  27. //                }elseif(strpos($rt,"2")!==0){
  28. //                    return false;
  29. //                }
  30. //            }                      //实际上跟 if 分支一样,这里为了方便描述,就copy了一遍
  31.         }


注意上面注释的部分,源码中是没有的,这样导致在不需要认证的情况下,邮件无法发送成功。
其原因是,发送 cmd:HELO phpwind 后,没有等待邮件服务器的response,就直接发送下一条命令。导致后面的程序在逻辑上出现了错误的判断,其实报文是正确的。
交互的报文如下:
  1. 220 mailserver.star-net.cn Microsoft ESMTP MAIL Service, Version: 6.0.3790.1830 ready at  Tue, 28 Aug 2007 11:35:08 +0800
  2. HELO phpwind
  3. MAIL FROM: <[email]taoy11@star-net.cn[/email]>
  4. 250 mailserver.star-net.cn Hello [218.5.3.199]
  5. RCPT TO: <[email]taoy@star-net.cn[/email]>
  6. 250 2.1.0 [email]taoy11@star-net.cn[/email]....Sender OK
  7. DATA
  8. 250 2.1.5 [email]taoy@star-net.cn[/email]
  9. 354 Start mail input; end with <CRLF>.<CRLF>

可以看到,连续发送了两条命令,最后收到的354响应没有得到正确的处理。

附件是wireshark抓到的报文。
[ 此贴被toyjoy1在2007-08-28 12:36重新编辑 ]
附件: bb.rar (14 K) 下载次数:41
2条评分
thinfo 威望 +3 可以试下。 2007-08-28
thinfo 威望 +3 可以试下。 2007-08-28
离线thinfo

发帖
37134
金钱
-35
威望
116187
只看该作者 沙发  发表于: 2007-08-28
嗯,可以尝试一下。
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
 
上一个 下一个