排查思路
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 端口
...... 後期將更新整理常見可能情況