最近有個項目從虛擬主機遷到雲主機上,換了個環境,原來用於找回密碼的發送郵件功能居然用不了了!反應極慢,致使tenginx報504網關超時錯誤。php
初次百度,看了別人發的文章,我覺得是php版本的問題,原來虛擬主機用的是PHP5.5,如今是7.0。天真的我又下了5.5版本的源碼,編譯安裝了個php5.5,用這個版本的php-fpm替代7.0版本的php-fpm,結果問題依然。python
再次問度娘,有人說是sockets擴展的問題,說安裝這個擴展。用php -m查看了下,sockets擴展是有的。多試一下老是沒錯的,抱着這個心理,我試了編譯安裝兩個版本的sockets擴展,仍是無濟於事。nginx
有的說法是fsockopen的問題,說要改下phpmailer的代碼,查看了下phpmailer的代碼,已是OK的。laravel
不關php版本和sockets擴展的問題,我把疑點放在phpmailer上,網上傳言swiftmailer效率要比phpmailer要好。因而下載了swiftmailer,寫了個測試代碼,在命令行下跑,結果仍是超時。不過此次看到了報錯,總算有點眉目了,是 不能跟smtp.mxhichina.com創建鏈接。莫非是dns解析問題?我用ip替換這個地址後仍是同樣錯誤,看來跟dns解析無關。
發郵件報錯的部份內容:swift
Fatal error: Uncaught exception 'Swift_TransportException' with message 'Connection could not be established with host smtp.mxhichina.com [Connection timed out #110]
phpmailer,swiftmailer都不行,我懷疑我用的是假的php,連個郵件都發送不了。因而借用了一段發郵件的python代碼,測試,報的也是鏈接超時。看來這個問題跟語言無關,我懷疑是centos系統設置的問題。windows
我在本機win7下測試,能夠正常發郵件。看來還真跟系統有關,離問題解決又近了些。我在windows下用telnet鏈接smtp.mxhichina.com的25端口,能夠正常連上,可在centos下連不上。centos
繼續百度,有的文章說發郵件也有可能用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上有人問跟這個如出一轍的問題,正好有人解答,不過是在laravel框架下的,大概就是更改配置什麼的,經過tls,要把端口設爲587。我把代碼中的25端口改爲587,運行,果真能夠發送!!問題就此解決!!框架
原來阿里雲的郵箱服務器的smtps協議用的是587端口,不知爲什麼一樣的參數,之前在虛擬主機中用25端口也是正常的。百度了下「smtp.mxhichina.com 端口」,阿里雲的幫助文檔是這樣的:
socket
465試過不能夠,也沒提到587,感受很受傷!!
轉自:http://blog.csdn.net/chunyuan314/article/details/62237626