Я пытаюсь отправить электронное письмо с этой конфигурацией:
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
и сертификат будет добавлен в список действительных центров сертификации вашего сервера.