排查思路

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 埠

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