排查思路
1,要確保填寫的郵件資訊是否正確,主要檢測郵件伺服器格式填寫。設定可以參考:(https://doc.weixiaoduo.com/discuz/12734.html)
2,檢視郵件日誌檔案,data/log 目錄下 有一個 201210_SMTP.php 類似這樣的檔案,下面舉例說明下
例 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 函式中的程式碼是。這樣就定位到具體的錯誤地方。
- fputs($fp, "MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from).">\r\n");
- $lastmessage = fgets($fp, 512);
- if(substr($lastmessage, 0, 3) != 250) {
- fputs($fp, "MAIL FROM: <".preg_replace("/.*\<(.+?)\>.*/", "\\1", $email_from).">\r\n");
- $lastmessage = fgets($fp, 512);
- if(substr($lastmessage, 0, 3) != 250) {
- runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) MAIL FROM - $lastmessage", 0);
- return false;
- }
- }
複製程式碼
例 2:
- Unable to connect to the SMTP server
複製程式碼
定位到程式碼 sendmail 函式的位置
- if(!$fp = fsocketopen($_G['setting']['mail']['server'], $_G['setting']['mail']['port'], $errno, $errstr, 30)) {
- runlog('SMTP', "({$_G[setting][mail][server]}:{$_G[setting][mail][port]}) CONNECT - Unable to connect to the SMTP server", 0);
- return false;
- }
複製程式碼
這的錯誤可能是伺服器禁止訪問外部郵件伺服器。。這裡就不一一例舉每種錯誤的情況 了 。排查思路是透過錯誤日誌定位,然後分析可能的錯誤原因。
常見錯誤情況:
1. 伺服器沒有開放 25 埠
方法:檢測伺服器是否開啟了 25 埠方,可以使用 telnet 命令進行驗證,本地安裝 telnet(安裝方式可以到網上搜尋相關教程), 執行 --輸入 cmd --輸入 telnet www.xxx.com(或者 ip)25 埠 看返回的資訊是什麼 。 或者諮詢空間商是否開放了 25 埠
...... 後期將更新整理常見可能情況