Laravel5.5 发送邮件遇到Connection could not be established with host xxxxx
Laravel输出的错误页面如下图:
服务器:阿里云香港节点(B区) CentOS6.8 64bit
lamp环境:PHP7.2.1
Laravel .env mail部分:
1
|
MAIL_DRIVER=smtp
|
问题发生前景:本地测试完全正常,相同配置在服务器上就被抛出异常。
因为之前遇到过由于端口没有放行而造成无法建立连接的问题,在此问题上我也做了一样的尝试,在安全组配置里面对465端口进行放行(无论是出口还是入口)。但是结果表示并不是这个问题,而我在没有配置放行的情况下,telnet host:port 是通的。
经过大约两天的间接性排查和尝试,最终提交工单咨询阿里,他们给了我处理意见:尝试他们的Demo!
尝试阿里云提供的Demo测试发件是没有问题的,这就令我很纳闷的,于是我去看该Demo是如何建立连接的。
通过一步一步的探索,发现该Demo也是同样使用了stream_socket_client方法来建立连接,那为什么它可以,Laravel内的却不行?说明不是该环境的问题!
问题逐渐定位到了stream_socket_client这个方法上,查询PHP.NET来认识一下它。
1
|
resource stream_socket_client ( string $remote_socket [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") [, int $flags = STREAM_CLIENT_CONNECT [, resource $context ]]]]] )
|
方法描述上,只有一个参数可能会不一样,就是最后那个$context,它是一个Resource,由stream_conntext_create方法创建并返回。
我注意到Laravel中使用的Swift_Mailer所引用的StreamBuffer类中,在stream_socket_client方法前面加上了@符号来屏蔽error,而在下面自己判断来抛出异常。
那么我果断将@符号去掉! 真正的错误爆出来了!!!!
1
|
stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
|
乍眼一看,证书校验失败????
上面的废话只是简单描述我遇到这个问题是如何应对的
解决方案来了! 既然是走SSL协议(465端口),且程序抛出错误为证书校验失败,那么就去直接搜索有关Laravel/SwitEmailer的证书校验问题。
在stackOverflow上找到两个相关的问题:
- localhost and “stream_socket_enable_crypto(): SSL operation failed with code 1”
- how to fix stream_socket_enable_crypto(): SSL operation failed with code 1
他们都提出了一个配置:
1
|
// 在/config/mail.php中增加
|
然后测试,Bingo!!!
当然,既然是SSL必然使用校验才是最安全的,但是我这里仅满足能够发件即可,至于如何进行证书校验,请移步:使用PHPMailer 中的报错解决 “Connection failed. Error #2: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:”
转载地址:https://www.imsry.cn/posts/ac505287.html

浙公网安备 33010602011771号