之前用php mail()没有发现问题,直到最近由于某些原因需要改用smtp发邮件时,发现DZ6.0声称成功送出邮件但对方没有收到。经参考过相关帖尝试各种参数后仍然没有解决问题,起初以为对方的服务器把邮件当成垃圾邮件处置,但翻查纪录后证实根本没有邮件送出,问题出在哪呢?经过两天两夜不眠不休地测试并把源码翻来覆去地钻研,发现这并不是参数设置错误引起的,而是源码内的一个BUG。
原因是:当smtp服务器反应慢或者网络比较慢时,DZ在未收到smtp服务器的回应之前就过早地把连接关闭掉,于是smtp服务器就弃掉了邮件,出现邮件被吞掉的假象。这种现象在smtp服务器及网络速度都较快时是不会出现,邮件能正常送出。
但为什么会过早地关掉连接呢?因为这是一个BUG,而且翻查后发现,这个BUG原来从旧版本一直沿袭至今。修补办法如下:
- 打开include\sendmail.inc.php文件
- 找到fputs($fp, "QUIT\r\n");这一行
- 在这一行之前插入如下代码:
- $lastmessage = fgets($fp, 512);
- if(substr($lastmessage, 0, 3) != 250) {
- $errorlog('SMTP', "($mail[server]mail[port]) DATA - $lastmessage", 0);
- }
复制代码 经修正后,DZ会等待smtp服务器的正式回应后才会把连接关闭掉,保证了邮件正常发送。
[ 本帖最后由 fredlou 于 2007-9-1 02:10 编辑 ] |