上一篇文章 Laravel 郵件配置 已經能夠成功傳送郵件 奈何部署到伺服器後盡然無法傳送。https://www.jianshu.com/p/459ab4f30c62
話不多說上圖。
嗯嗯 看錯誤 是像埠被禁用了。
Connection could not be established with host smtp.exmail.qq.com
查文件。有一個童鞋一樣的問題 連結 https://yq.aliyun.com/ask/65259
嗯禁用了25埠 可是我這個 465埠沒有禁用呀。
確認一下
root@www:~# telnet smtp.exmail.qq.com 465
Trying 163.177.72.143...
Connected to smtp.exmail.qq.com.
Escape character is '^]'.
嗯 確實正常
那麼就是環境的問題了
換個版本試試。
換成PHP7.2 正常
問題就出在php7.3上了
我們看看 laravel 報錯的位置
$streamContext = stream_context_create($options);
$this->stream = @stream_socket_client($host.':'.$this->params['port'], $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $streamContext);
if (false === $this->stream) {
throw new Swift_TransportException(
'Connection could not be established with host '.$this->params['host'].
' ['.$errstr.' #'.$errno.']'
);
}
嗯 是 stream_socket_client 這個函式沒有正常執行。
查文件 php7.2到php7.3沒有對這個函式進行更改。
那麼問題出在哪呢。
將這段程式碼拎出來單獨執行。
<?php
$a=stream_socket_client("ssl://smtp.exmail.qq.com:465", $errno, $errstr, 120, STREAM_CLIENT_CONNECT);
?>
錯誤出來了
Warning: stream_socket_client(): open_basedir restriction in effect. File(/etc/pki/tls/certs/ca-bundle.crt) is not within the allowed path(s): (/www/wwwroot/test.zhusutao.com/:/tmp/:/proc/) in /www/wwwroot/test.zhusutao.com/test.php on line 2
Warning: failed loading cafile stream: `/etc/pki/tls/certs/ca-bundle.crt' in /www/wwwroot/test.zhusutao.com/test.php on line 2
Warning: stream_socket_client(): Failed to enable crypto in /www/wwwroot/test.zhusutao.com/test.php on line 2
Warning: stream_socket_client(): unable to connect to ssl://smtp.exmail.qq.com:465 (Unknown error) in /www/wwwroot/test.zhusutao.com/test.php on line 2
說 open_basedir
沒有包含 /etc/pki/tls/certs/ca-bundle.crt
那麼包含進去吧。
發現還是不行。
看一下這個檔案存在不 /etc/pki/tls/certs/ca-bundle.crt
嗯果然不存在。
看檔名像是證照檔案。
比對一下php7.2的配置
嗯
php7.2 的配置
curl.cainfo = /etc/ca-bundle.crt
openssl.cafile = /etc/ca-bundle.crt
php7.3的配置
curl.cainfo = /etc/pki/tls/certs/ca-bundle.crt
openssl.cafile = /etc/pki/tls/certs/ca-bundle.crt
嗯 檔案路徑錯誤無疑了
改過來
php7.3新的的配置
curl.cainfo = /etc/ca-bundle.crt
openssl.cafile = /etc/ca-bundle.crt
在試著傳送一下
完美!