laravel5发送ssl邮箱问题

简介:

laravel5已经有很好的邮件发送功能,但都是常规 tls 不加密协议,现在有的云服务器已经慢慢禁止使用不加密协议,要求使用ssl加密协议;如阿里云新购买的服务器都开始禁止。


由于laravel5默认使用的是 swiftmailer 扩展。发送使用的是 stream 其中并未对ssl提供证书等内容配置,所以当使用ssl时又未指定证书时会错:

Connection could not be established with host *******.com [ #0]

连接失败,造成错误的地方:vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php 类

Swift_Transport_StreamBuffer 的 _establishSocketConnection 方法在调用 stream_context_create 时缺少证书相关配置。

看看PHP官方文档:http://php.net/manual/zh/context.ssl.php


wKiom1nbHRLBV0JdAADsz4MC7Do148.png

其中需要注意的是 verify_peer_name 要求验证证书名默认值为true,这里是问题所以,当没有指定证书时该值会影响连接验证失败导致整个连接失败。因此需要修改代码并把 verify_peer_name 设置为 false。

这个问题在 https://github.com/swiftmailer/swiftmailer/issues/544 中已经有说明。

但其增加了两行代码把 verify_peer 和 verify_peer_name 都设置为false 。依文档中看,verify_peer 默认值已经是 false ,所以可以不加。

修改代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
     /**
      * Establishes a connection to a remote server.
      */
     private  function  _establishSocketConnection()
     {
         $host  $this ->_params[ 'host' ];
         if  (! empty ( $this ->_params[ 'protocol' ])) {
             $host  $this ->_params[ 'protocol' ]. '://' . $host ;
         }
         $timeout  = 15;
         if  (! empty ( $this ->_params[ 'timeout' ])) {
             $timeout  $this ->_params[ 'timeout' ];
         }
         $options  array ();
         if  (! empty ( $this ->_params[ 'sourceIp' ])) {
             $options [ 'socket' ][ 'bindto' ] =  $this ->_params[ 'sourceIp' ]. ':0' ;
         }
         
         //在这里增加代码,修改默认值
         $options [ 'ssl' ][ 'verify_peer_name' ] = FALSE;
         
         $this ->_stream = @stream_socket_client( $host . ':' . $this ->_params[ 'port' ],  $errno $errstr $timeout , STREAM_CLIENT_CONNECT, stream_context_create( $options ));
         if  (false ===  $this ->_stream) {
             throw  new  Swift_TransportException(
                 'Connection could not be established with host ' . $this ->_params[ 'host' ].
                 ' [' . $errstr . ' #' . $errno . ']'
                 );
         }
         if  (! empty ( $this ->_params[ 'blocking' ])) {
             stream_set_blocking( $this ->_stream, 1);
         else  {
             stream_set_blocking( $this ->_stream, 0);
         }
         stream_set_timeout( $this ->_stream,  $timeout );
         $this ->_in = & $this ->_stream;
         $this ->_out = & $this ->_stream;
     }

当然如果把 verify_peer 加上也没有问题。

本文转自  ttlxihuan    51CTO博客,原文链接:http://blog.51cto.com/php2012web/1970918


相关文章
|
12月前
|
安全 网络安全
Foxmail邮箱提示错误:ssl连接错误,errorCode:5解决方法
Foxmail邮箱提示错误:ssl连接错误,errorCode:5解决方法
2140 0
|
Linux 网络安全 开发工具
Centos 7下如何配置SMTP SSL(邮箱发送功能)
Centos 7下如何配置SMTP SSL(邮箱发送功能)
1608 0
Centos 7下如何配置SMTP SSL(邮箱发送功能)
|
5月前
|
网络安全 数据安全/隐私保护
JavaMail给QQ邮箱发邮件报错,没有SSL加密
JavaMail给QQ邮箱发邮件报错,没有SSL加密
|
4月前
|
安全 网络安全
如何给网站添加ssl安全证书
如何给网站添加ssl安全证书
91 1
|
18天前
|
运维 安全 数据建模
阿里云SSL证书收费版和免费版SSL有什么区别?全方位对比
阿里云提供免费和个人测试(Pro)及正式版SSL证书。免费版有效期仅3个月,适合个人网站或测试使用;个人测试(Pro)版68元/年,有效期12个月;正式版价格数百至数千元不等,有效期至少1年,支持DV、OV、EV证书类型,具有高安全等级、良好兼容性、稳定OCSP验证、SLA保障及安全保险赔付等优势,并提供最长3年的服务周期与人工客服支持。详情与报价参见SSL官方页面。
147 20
|
1月前
|
运维 安全 数据建模
阿里云免费SSL证书和收费版SSL证书有什么区别?
阿里云提供免费与收费SSL证书,前者有效期仅3个月,适合个人网站或测试使用;后者有效期至少1年,具备更高安全等级、良好兼容性及OCSP验证稳定性等优势,适用于企业网站,尤其政府、金融等领域建议选用OV或EV型证书以确保数据与身份认证安全。详细了解与报价请访问SSL证书官方页面。
148 2
|
1月前
|
网络协议 网络安全 数据安全/隐私保护
🔒SSL免费证书自动申请及续期-Certimate
Certimate 是一款旨在简化 SSL 证书管理的工具,尤其适用于需要维护多个域名的个人或小企业用户。它可以自动申请和续期证书,避免了手动操作的繁琐与易忘问题。Certimate 支持私有部署,确保数据安全,并能通过简单配置自动完成证书申请与续期,无需人工干预。详情及使用文档见:[https://docs.certimate.me](https://docs.certimate.me)。
298 1
|
2月前
|
监控 安全 Linux
在Linux中,如何管理SSL/TLS证书?
在Linux中,如何管理SSL/TLS证书?
|
2月前
|
安全 网络安全 Windows
【Azure App Service】遇见az命令访问HTTPS App Service 时遇见SSL证书问题,暂时跳过证书检查的办法
【Azure App Service】遇见az命令访问HTTPS App Service 时遇见SSL证书问题,暂时跳过证书检查的办法
【Azure App Service】遇见az命令访问HTTPS App Service 时遇见SSL证书问题,暂时跳过证书检查的办法
|
2月前
|
网络协议 应用服务中间件 网络安全
阿里云免费SSL申请流程(白嫖20张SSL免费证书)2024年新版教程
本文详述了2024年最新的阿里云免费SSL证书申请流程。用户可通过阿里云数字证书管理服务控制台一键申请最多20张免费单域名SSL证书,每张证书有效期为3个月。首先登录控制台,选择“SSL证书管理”下的“个人测试证书”,同意协议并完成购买流程。之后需创建证书、输入域名等信息并进行域名验证。验证方法包括手动DNS验证、域名授权自动化验证或文件验证。完成验证后,等待审核通过即可下载适用于不同服务器类型的SSL证书。请注意,阿里云免费SSL证书到期后不支持续费,需重新申请。了解更多详情,请访问阿里云官方SSL证书页面。
下一篇
无影云桌面