《PHP實例:Linux服務器下PHPMailer發送郵件失敗的問題解決》要點:
本文介紹了PHP實例:Linux服務器下PHPMailer發送郵件失敗的問題解決,希望對您有用。如果有疑問,可以聯系我們。
需求PHP實例
更換服務器之后,我發現我的發送郵件功能失效了!原來的服務器是可以的,一定是哪里出問題了,決定來排查一下.我是用的PHPMailer,SMTP方式發送郵件的.PHP實例
排查過程PHP實例
這種方式首先PHP要開啟sockets拓展,查了一下phpinfo頁面,是開啟的:PHP實例
PHP實例
看了一下openssl也是開啟(因為拿了qq郵箱來測),所以沒問題:PHP實例
PHP實例
那就再看一下allow_url_fopen,開啟的,沒問題:PHP實例
PHP實例
是不是禁用了函數?沒有禁用,沒問題:PHP實例
PHP實例
那配置上就沒有問題了,我就想,是不是端口被占用了?PHP實例
運行一下:netstat -tnlp
PHP實例
第一條就是這玩意:PHP實例
PHP實例
25端口被占用,被一個叫master的玩意占了,好家伙,看看是什么東西,運行ps -f -p 1818
看一下結果,1818為當前這個程序的進程號PID,可以看到是:PHP實例
PHP實例
是postfix這個東西在運行,可能搭建環境的時候不小心給裝了.PHP實例
postfix是個什么東西?PHP實例
postfix是一款運行在Linux環境下免費的郵件服務器,或者稱為MTA(Mail Transfer Agent),其它類似的有Sendmail、Qmail、exim及Zmailer 等.所以Postfix就是一個搭郵件服務器的.那這玩意肯定是沖突了,我們要通過25端口請求外部的郵件服務器,而本地用25端口運行了一個郵件服務器,這個是不行的估計.PHP實例
嘗試解決問題PHP實例
我們嘗試一下用我們這個郵件服務器去發郵件,而不是用外部服務器(比如之前用阿里云企業郵),放了一小段測試代碼到PHPMailer目錄同級下:PHP實例
<?php header("content-type:text/html;charset=utf-8"); require 'PHPMailer/class.phpmailer.php'; try { $mail = new PHPMailer(true); $mail->IsSMTP(); $mail->CharSet='UTF-8'; $mail->SMTPAuth = true; $mail->Port = 25; $mail->Host = '127.0.0.1';//郵箱smtp地址 $mail->Username = 'gzp@gzpblog.com';//你的郵箱賬號 $mail->Password = '扒拉扒拉...';//你的郵箱密碼 $mail->From = 'gzp@gzpblog.com';//你的郵箱賬號 $mail->FromName = '鍋子'; $to = "扒拉扒拉@qq.com"; $mail->AddAddress($to); $mail->Subject = "test"; $mail->Body = 'hello!'; $mail->WordWrap = 80; $mail->IsHTML(true); $mail->Send(); echo "success!"; } catch (phpmailerException $e) { echo "郵件發送失敗:".$e->errorMessage(); }
通過25端口的本地服務器發送郵件,運行這個頁面,發現不行,報錯不能夠驗證,說明這其中還有一些配置要弄,暫時行不通,不往下深究本地服務器發送了,我們嘗試一下換回:PHP實例
$mail->Host = ‘smtp.mxhichina.com'; //阿里云的郵箱smtp地址
試一下,還是不行:PHP實例
PHP實例
沒辦法連接到SMTP.那我們把25端口的postfix服務器殺掉, 執行kill 1818(當前postfix的PID),再執行一次,還是同樣錯誤,無法連接上.這就奇了怪了,25端口沒有程序運行了,還不行.PHP實例
可能的原因PHP實例
查到有可能是因為ipv6的原因,phpMailer在進行smtp服務器DNS解析時,得到了IP v6地址,然后與IP v6解析到的地址進行連接,導致連接失敗.PHP實例
我試一下:PHP實例
ip -6 addr show
PHP實例
PHP實例
沒東西,那又不是這個問題.PHP實例
那是什么原因呢?PHP實例
解決問題PHP實例
既然25端口不可用,于是我想,是否可以嘗試一下其它端口,用465端口試試.PHP實例
465端口(SMTPS):465端口是為SMTPS(SMTP-over-SSL)協議服務開放的,這是SMTP協議基于SSL安全協議之上的一種變種協議,它繼承了SSL安全協議的非對稱加密的高度安全可靠性,可防止郵件泄露.SMTPS和SMTP協議一樣,也是用來發送郵件的,只是更安全些,防止郵件被黑客截取泄露,還可實現郵件發送者抗抵賴功能.防止發送者發送之后刪除已發郵件,拒不承認發送過這樣一份郵件.
PHP實例
465端口似乎看起來還更好,直接就開始嘗試了,進行以下嘗試,以下為命令:
PHP實例
sbin/iptables -I OUTPUT -p tcp Cdport 465 -j ACCEPT?
打通465端口
PHP實例
/etc/rc.d/init.d/iptables save
保存
PHP實例
service iptables restart
重啟
PHP實例
/etc/init.d/iptables status
查看需要打開的端口是否生效?PHP實例
PHP實例
似乎可行,現在嘗試一下,用SMTP的465SSL連接方式來發送郵件,稍微改了一下測試代碼:PHP實例
<?php header("content-type:text/html;charset=utf-8"); require 'PHPMailer/class.phpmailer.php'; try { $mail = new PHPMailer(true); $mail->IsSMTP(); $mail->CharSet='UTF-8'; $mail->SMTPAuth = true; $mail->SMTPSecure = 'ssl'; $mail->Port = 465; $mail->Host = 'smtp.mxhichina.com';//郵箱smtp地址 $mail->Username = 'gzp@gzpblog.com';//你的郵箱賬號 $mail->Password = '扒拉扒拉...';//你的郵箱密碼 $mail->From = 'gzp@gzpblog.com';//你的郵箱賬號 $mail->FromName = '鍋子'; $to = "扒拉扒拉@qq.com"; $mail->AddAddress($to); $mail->Subject = "test"; $mail->Body = 'hello!'; $mail->WordWrap = 80; //$mail->AddAttachment("f:/test.png"); //可以添加附件 $mail->IsHTML(true); $mail->Send(); echo "success!"; } catch (phpmailerException $e) { echo "郵件發送失敗:".$e->errorMessage(); //測試的時候可以去掉此行的注釋 }
執行,成功!右下角彈出了QQ郵件的提醒.PHP實例
總結PHP實例
PHPMailer通過465端口進行更安全的SMTPS協議發送郵件PHP實例
可以修改:PHP實例
$mail->Port = 465;
為:PHP實例
$mail->SMTPSecure = 'ssl'; $mail->Port = 465;
即可.PHP實例
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對維易PHP的支持.PHP實例
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/1515.html