解決CentOS下無法傳送郵件的問題
最近有個專案從虛擬主機遷到雲主機上,換了個環境,原來用於找回密碼的傳送郵件功能竟然用不了了!反應極慢,導致tenginx報504閘道器超時錯誤。
5.5 or 7.0, sockets
初次百度,看了別人發的文章,我以為是php版本的問題,原來虛擬主機用的是PHP5.5,現在是7.0。天真的我又下了5.5版本的原始碼,編譯安裝了個php5.5,用這個版本的php-fpm替代7.0版本的php-fpm,結果問題依然。
再次問度娘,有人說是sockets擴充套件的問題,說安裝這個擴充套件。用php -m查看了下,sockets擴充套件是有的。多試一下總是沒錯的,抱著這個心理,我試了編譯安裝兩個版本的sockets擴充套件,還是無濟於事。
fsockopen
有的說法是fsockopen的問題,說要改下phpmailer的程式碼,查看了下phpmailer的程式碼,已經是OK的。
phpmailer vs swiftmailer, dns
不關php版本和sockets擴充套件的問題,我把疑點放在phpmailer上,網上傳言swiftmailer效率要比phpmailer要好。於是下載了swiftmailer,寫了個測試程式碼,在命令列下跑,結果還是超時。不過這次看到了報錯,總算有點眉目了,是 不能跟smtp.mxhichina.com建立連線。莫非是dns解析問題?我用ip替換這個地址後還是一樣錯誤,看來跟dns解析無關。
發郵件報錯的部分內容:
Fatal error: Uncaught exception 'Swift_TransportException' with message 'Connection could not be established with host smtp.mxhichina.com [Connection timed out #110]
php vs python
phpmailer,swiftmailer都不行,我懷疑我用的是假的php,連個郵件都發送不了。於是借用了一段發郵件的python程式碼,測試,報的也是連線超時。看來這個問題跟語言無關,我懷疑是centos系統設定的問題。
window vs centos
我在本機win7下測試,可以正常發郵件。看來還真跟系統有關,離問題解決又近了些。我在windows下用telnet連線smtp.mxhichina.com的25埠,可以正常連上,可在centos下連不上。
25 vs 465
繼續百度,有的文章說發郵件也有可能用465埠了,用的是smtps。原來一直用的都是25埠。試了下在centos下用telnet連線465埠,可以正常連線。於是把發郵件的php程式碼改成用這個埠,也是失敗,不過報的是另外一個錯誤了。好好的一個雲主機,竟然發郵件都不行!一怒之下果斷向阿里雲提交工單。
第種報錯資訊:
Fatal error: Uncaught exception 'Swift_TransportException' with message 'Expected response code 220 but got code "", with message ""'
stackoverflow, 587
提交工單完畢,心中緩了一下。一個問題折騰了這麼久,感覺不想就這樣放棄了,於是按這個錯誤資訊百度,竟然在stackoverflow上有人問跟這個一模一樣的問題,正好有人解答,不過是在laravel框架下的,大概就是更改配置什麼的,通過tls,要把埠設為587。我把程式碼中的25埠改成587,執行,果然可以傳送!!問題就此解決!!
原來阿里雲的郵箱伺服器的smtps協議用的是587埠,不知為何同樣的引數,以前在虛擬主機中用25埠也是正常的。百度了下“smtp.mxhichina.com 埠”,阿里雲的幫助文件是這樣的:
465試過不可以,也沒提到587,感覺很受傷!!