15

我正在尝试使用此配置发送电子邮件:

return [

    'driver'     => 'smtp',

    'host'       => 'mail.mydomain.com',

    'port'       => 26,

    'from'       => ['address' => 'mailer@mydomain.com', 'name' => 'Mailer'],

    'encryption' => 'tls',

    'username'   => env('MAIL_USERNAME'),

    'password'   => env('MAIL_PASSWORD'),

    'sendmail'   => '/usr/sbin/sendmail -bs',

    'pretend'    => false,

];

当我提交表单时,我收到此错误:

ErrorException in StreamBuffer.php line 95:
stream_socket_enable_crypto(): SSL operation failed with code 1.
OpenSSL Error messages:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

我找到了这个解决方案,人们似乎已经用同一个库解决了这个问题,但我无法在 Laravel 中解决它。

https://github.com/PHPMailer/PHPMailer/issues/368

4

4 回答 4

24

编者注:禁用 SSL 验证具有安全隐患。如果不验证 SSL/HTTPS 连接的真实性,恶意攻击者可以冒充受信任的端点(例如 GitHub 或其他远程 Git 主机),您将容易受到中间人攻击

在将其用作解决方案之前,请确保您完全了解安全问题。

在 config/mail.php 的底部添加这个

'stream' => [
   'ssl' => [
       'allow_self_signed' => true,
       'verify_peer' => false,
       'verify_peer_name' => false,
   ],
],

这将解决您的问题。

于 2017-10-17T06:33:45.523 回答
8

那么在那个链接中你提供的解决方案是直截了当的。

正确的解决方案是修复您的 SSL 配置 - 这不是 PHP 的错!

如何解决?在config/mail.php'driver' => env('MAIL_DRIVER', 'smtp'),应该是'driver' => env('MAIL_DRIVER', 'mail'),(学分:Danyal Sandeelo

于 2015-06-08T16:22:09.880 回答
5

如果您使用的是 Laravel 7.0,您可以通过这种方式在 SwiftMailer 中禁用 SSL 验证(请注意,不建议禁用 SSL 验证!):

config/mail.php

'mailers' => [
    'smtp' => [
        'transport' => 'smtp',
        'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
        'port' => env('MAIL_PORT', 587),
        'encryption' => env('MAIL_ENCRYPTION', 'tls'),
        'username' => env('MAIL_USERNAME'),
        'password' => env('MAIL_PASSWORD'),
        'timeout' => null,
        'stream' => [
            'ssl' => [
                'allow_self_signed' => true,
                'verify_peer' => false,
                'verify_peer_name' => false,
            ],
        ],
    ],
],
于 2020-05-04T08:32:26.720 回答
4

就我而言,问题与 SSL 有关。我的 SMTP 有一个自签名证书,并且我的 laravel 运行在 PHP 5.6 之上,它将“allow_self_signed”上下文变量禁用为 false,并启用“verify_peer”,因此在发送电子邮件时会弹出错误。

由于我不想破解 swiftmailer 代码,因此我将服务器的证书颁发机构 (CA) 文件添加为执行 laravel 的系统的可信 CA。

我这样做是为了获得我的 smtp 服务器的 CA 证书,比如

-----BEGIN CERTIFICATE-----
MIIElTCCA32gAwIBAgIJAMZjjNg64RQwMA0GCSqGSIb3DQEBCwUAMIGNMQswCQYD
VQQGEwJVUzEMMAoGA1UECBMDTi9BMQwwCgYDVQQHEwNOL0ExJDAiBgNVBAoTG1pp
...
5a8a4QEwWmnAOgHetsOCvhfeGW3yAJPD8Q==
-----END CERTIFICATE-----

并将其写入我的 laravel 机器中,该机器有一个 ubuntu 14.04 到一个名为/usr/local/share/ca-certificates/my_cert.crt. 以文件结尾.crt并使其对每个人都可读是至关重要的。

然后调用update-ca-certificates,证书将被添加到您服务器的有效 CA 列表中。

于 2016-07-27T06:03:03.353 回答