具有TLS加密的Laravel SMTP驱动程序

Ala*_*lan 9 php email ssl laravel self-signed-certificate

我正在尝试发送包含此配置的电子邮件:

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,

];
Run Code Online (Sandbox Code Playgroud)

当我提交表格时,我收到了这个erorr:

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
Run Code Online (Sandbox Code Playgroud)

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

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

M A*_*fan 21

在config/mail.php的底部添加它

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

这将解决您的问题.

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

  • 人们应该非常清楚,使用此解决方案应该非常清楚,这仅比根本不使用加密稍微安全一些,而使用适当的 SSL 和同行验证的证书要安全得多。仅当您 100% 知道需要使用自签名证书并且 100% 确定它没有被篡改时才使用此证书,并且切勿在生产中使用此证书。 (2认同)

geg*_*eto 7

那么你提供的解决方案是直截了当的.

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

  • 你如何修复SSL配置? (4认同)

小智 7

在 Laravel 9 中,不再支持为 SMTP 传输定义流选项。相反,如果支持的话,您必须直接在配置中定义相关选项。例如,要禁用 TLS 对等验证:

'smtp' => [
    // Laravel 8.x...
    'stream' => [
        'ssl' => [
            'verify_peer' => false,
        ],
    ],
 
    // Laravel 9.x...
    'verify_peer' => false,
],
Run Code Online (Sandbox Code Playgroud)


小智 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,
            ],
        ],
    ],
],
Run Code Online (Sandbox Code Playgroud)