Laravel 郵件無法傳送原因的查詢

mrcong2018發表於2019-02-23

上一篇文章 Laravel 郵件配置 已經能夠成功傳送郵件 奈何部署到伺服器後盡然無法傳送。https://www.jianshu.com/p/459ab4f30c62

話不多說上圖。

image.png

image.png

嗯嗯 看錯誤 是像埠被禁用了。

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 '^]'.

嗯 確實正常

那麼就是環境的問題了
換個版本試試。

image.png

換成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
那麼包含進去吧。

image.png

發現還是不行。

看一下這個檔案存在不 /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

在試著傳送一下

image.png

完美!

Laravel 技術交流QQ群 852529151

相關文章