排查思路

1,要確保填寫的郵件信息是否正確,主要檢測郵件服務器格式填寫。設置可以參考:(https://doc.weixiaoduo.com/discuz/12734.html

2,查看郵件日誌文件,data/log 目錄下 有一個 201210_SMTP.php 類似這樣的文件,下面舉例説明下
例 1:

  1. <?PHP exit;?>        2012-10-17 16:59:59        127.0.0.1        1        /admin.php?action=checktools&operation=mailcheck&frame=no        (smtp.qq.com:25) MAIL FROM -

複製代碼

通過失敗日誌,進入程序 source/function/function_mail.php, sendmail 函數在失敗的時候會記錄。 如上面的日誌中 「MAIL FROM」,在 sendmail 函數中的代碼是。這樣就定位到具體的錯誤地方。

  1. fputs($fp, "MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from).">\r\n");
  2.                 $lastmessage = fgets($fp, 512);
  3.                 if(substr($lastmessage, 0, 3) != 250) {
  4.                         fputs($fp, "MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from).">\r\n");
  5.                         $lastmessage = fgets($fp, 512);
  6.                         if(substr($lastmessage, 0, 3) != 250) {
  7.                                 runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) MAIL FROM - $lastmessage", 0);
  8.                                 return false;
  9.                         }
  10.                 }

複製代碼

     例 2:

  1. Unable to connect to the SMTP server

複製代碼

定位到代碼 sendmail 函數的位置

  1. if(!$fp = fsocketopen($_G['setting']['mail']['server'], $_G['setting']['mail']['port'], $errno, $errstr, 30)) {
  2.                         runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) CONNECT - Unable to connect to the SMTP server", 0);
  3.                         return false;
  4.                 }

複製代碼

這的錯誤可能是服務器禁止訪問外部郵件服務器。。這裏就不一一例舉每種錯誤的情況 了 。排查思路是通過錯誤日誌定位,然後分析可能的錯誤原因。

常見錯誤情況:
1. 服務器沒有開放 25 端口
方法:檢測服務器是否開啓了 25 端口方,可以使用 telnet 命令進行驗證,本地安裝 telnet(安裝方式可以到網上搜索相關教程), 運行 --輸入 cmd --輸入 telnet   www.xxx.com(或者 ip)25 端口 看返回的信息是什麼 。 或者諮詢空間商是否開放了 25 端口

...... 後期將更新整理常見可能情況