localhost和"stream_socket_enable_crypto():SSL操作失败,代码为1"

Sau*_*oco 11 php email laravel laravel-5.2

我使用gmail发送电子邮件,一切都运行得很好,但突然之间停止了工作.它告诉我这个

ErrorException in StreamBuffer.php line 94:

stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

in StreamBuffer.php line 94
at HandleExceptions->handleError('2', 'stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed', 'C:\xampp\htdocs\coparmex\vendor\swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php', '94', array())
at stream_socket_enable_crypto(resource, true, '9') in StreamBuffer.php line 94
at Swift_Transport_StreamBuffer->startTLS() in EsmtpTransport.php line 313
at Swift_Transport_EsmtpTransport->_doHeloCommand() in AbstractSmtpTransport.php line 118
at Swift_Transport_AbstractSmtpTransport->start() in Mailer.php line 79
at Swift_Mailer->send(object(Swift_Message), array()) in Mailer.php line 385
at Mailer->sendSwiftMessage(object(Swift_Message)) in Mailer.php line 171
Run Code Online (Sandbox Code Playgroud)

这只发生在我的localhost,在web主机上运行正常.我不明白发生了什么:c

这些是我的Gmail设置

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=gmail
MAIL_PASSWORD=password
MAIL_ENCRYPTION=tls
Run Code Online (Sandbox Code Playgroud)

Jun*_*ood 34

您应该在/config/mail.php中添加以下代码(在laravel 5.4上工作)

'stream' => [
'ssl' => [
    'allow_self_signed' => true,
    'verify_peer' => false,
    'verify_peer_name' => false,
],
],
Run Code Online (Sandbox Code Playgroud)

因为你不应该按照苏丹艾哈迈德的建议改变供应商的代码

编者注:禁用SSL验证具有安全隐患.如果不验证SSL/HTTPS连接的真实性,恶意攻击者可以冒充受信任的端点(例如GitHub或其他一些远程Git主机),并且您将容易受到中间人攻击.在将此作为解决方案之前,请确保完全了解安全问题.

  • 请记得在复制粘贴时发布源代码,如果有人想提出正确的回答,请参阅[此答案](/sf/answers/3219952991/).@VandolphReyes不,不应该.这个答案并没有为接受的答案添加任何内容. (4认同)

and*_*yrk 9

这是您的SSL证书的错误.您正在尝试使用没有适当证书的SSL连接(加密,安全连接).

那是因为您从localhost连接,这是不安全的,并且被连接阻止.您可以通过将localhost连接更改为基于SSL的连接来避免这种情况.

有关详细信息,请参阅此链接.

  • 添加这两行 $options['ssl']['verify_peer'] = FALSE; $options['ssl']['verify_peer_name'] = FALSE; 在此文件中:vendor\swiftmailer\swiftmailer\lib\classes\Swift\Transport\StreamBuffer.php 函数中的 _establishSocketConnection(),但我当然不会在生产服务器中执行此操作 (2认同)