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