Драйвер SMTP Laravel с шифрованием TLS

Я пытаюсь отправить электронное письмо с этой конфигурацией:

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, ]; 

Когда я отправлю форму, я получаю этот 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 

Я нашел это решение, где люди, похоже, решили проблему с той же библиотекой, но я не могу решить ее в Laravel.

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

Ну, в этой ссылке вы дали решение прямолинейно.

Правильное решение – исправить вашу конфигурацию SSL – это не ошибка PHP!

Добавьте это внизу своей конфигурации / mail.php

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

это решит вашу проблему.

В моем случае проблема была связана с SSL. У моего SMTP есть самозаверяющий сертификат, и мой laravel работает поверх PHP 5.6, который отключает контекстную переменную allow_self_signed в false и разрешает «verify_peer» и, следовательно, выдает ошибку при отправке электронной почты.

Поскольку я не хотел взломать код swiftmailer, я добавил файл Certificate Authority (CA) моего сервера как доверенный CA для моей системы, выполняющей laravel.

Я сделал это, получив сертификат CA моего сервера smtp, что-то вроде

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

и напишите его в моей машине laravel, которая имеет файл ubuntu 14.04 в файл с именем /usr/local/share/ca-certificates/my_cert.crt . Крайне важно завершить файл с помощью .crt а также сделать его доступным для всех.

Затем вызовите update-ca-certificates и сертификат будет добавлен в список действительных центров сертификации вашего сервера.