CakePHP 3 error for sending email using gmail

I am trying to send an email confirmation using Gmail, but I am getting this error:

stream_socket_client (): SSL operation failed with code 1. OpenSSL Error messages: error: 14090086: SSL routines: SSL3_GET_SERVER_CERTIFICATE: certificate verification failed stream_socket_client (): Cryptography could not be enabled stream_socket_client (): cannot connect to ssl: // smtp .gmail.com: 465 (Unknown error)

I followed the Transport setup guide.

Email::configTransport('gmail', [ 'host' => 'ssl://smtp.gmail.com', //'host' => 'smtp.gmail.com', 'port' => 465, 'username' => ' user@gmail.com ', 'password' => 'password', 'className' => 'Smtp', 'log'=>true, //'tls' => true ]); $correo = new Email(); $correo ->transport('gmail') ->template('registro_exito') ->emailFormat('html') ->to(' email@gmail.com ') ->from(' another_email@gmail.com ') ->viewVars([ 'nombre_sitio_secundario'=>$nombre_sitio_secundario, 'usuario_id'=>$usuario_id, 'token'=>$token ]) ->send(); 

And this is the complete error log:

 2015-09-24 20:09:39 Error: [Cake\Network\Exception\SocketException] stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed stream_socket_client(): Failed to enable crypto stream_socket_client(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) Request URL: /faindit/usuarios/registro Stack Trace: #0 C:\xampp\htdocs\faindit\vendor\cakephp\cakephp\src\Network\Email\SmtpTransport.php(204): Cake\Network\Socket->connect() #1 C:\xampp\htdocs\faindit\vendor\cakephp\cakephp\src\Network\Email\SmtpTransport.php(159): Cake\Network\Email\SmtpTransport->_connect() #2 C:\xampp\htdocs\faindit\vendor\cakephp\cakephp\src\Network\Email\Email.php(1301): Cake\Network\Email\SmtpTransport->send(Object(Cake\Network\Email\Email)) #3 C:\xampp\htdocs\faindit\src\Controller\Component\CorreoComponent.php(65): Cake\Network\Email\Email->send() #4 C:\xampp\htdocs\faindit\src\Controller\UsuariosController.php(14): App\Controller\Component\CorreoComponent->registroExito(1, ' something@gm... ') #5 [internal function]: App\Controller\UsuariosController->registro() #6 C:\xampp\htdocs\faindit\vendor\cakephp\cakephp\src\Controller\Controller.php(411): call_user_func_array(Array, Array) #7 C:\xampp\htdocs\faindit\vendor\cakephp\cakephp\src\Routing\Dispatcher.php(114): Cake\Controller\Controller->invokeAction() #8 C:\xampp\htdocs\faindit\vendor\cakephp\cakephp\src\Routing\Dispatcher.php(87): Cake\Routing\Dispatcher->_invoke(Object(App\Controller\UsuariosController)) #9 C:\xampp\htdocs\faindit\webroot\index.php(37): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response)) #10 {main} 

It is worth mentioning that openssl es is enabled on php, and I also enabled "access for less secure applications" in Gmail configurations.

Thanks for the help!

+5
source share
2 answers

Ok, I found a "mistake". Actually, the code is in order, the problem is OpenSSL in php 5.6, which checks every encrypted connection by default, BUT my local Lampp does not take into account with the ssl certificate, and this leads to an error.

The solution is to avoid validation, so the configTransport code will look like this:

 Email::configTransport('gmail', [ 'host' => 'ssl://smtp.gmail.com', 'port' => 465, 'username' => ' user@gmail.com ', 'password' => 'password', 'className' => 'Smtp', 'log' => true, 'context' => [ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ] ] ]); 

I took the response of PHPMailer as a reference, but it was a little difficult to find out how to apply it to Cakephp3.

Hope this information is helpful to someone else.

+12
source
  Send a verification email using gmail in CakePhp 3 Follow these steps to send verification code using gmail 1. open your your project/config/app.php 2. In your app.php, replace(hide) this code 'EmailTransport' => [ 'default' => [ 'className' => 'Mail', // The following keys are used in SMTP transports 'host' => 'localhost', 'port' => 25, 'timeout' => 30, 'username' => 'user', 'password' => 'secret', 'client' => null, 'tls' => null, 'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null), ], write this code in your app.php 'EmailTransport' => [ 'default' => [ 'className' => 'Mail', // The following keys are used in SMTP transports 'host' => 'localhost', 'port' => 25, 'timeout' => 30, 'username' => 'user', 'password' => 'secret', 'client' => null, 'tls' => null, 'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null), ], 'gmail'=> [ 'host' => 'ssl://smtp.gmail.com', 'port' => 465, 'username' => ' abc@gmail.com ', //your gmail address 'password' => 'abcd123', //your gmail password 'className' => 'Smtp', 'log' => true, 'context' => [ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ] ] ], ], 3. Now open your Controller file and add this code use Cake\Mailer\Email; use Cake\Network\Exception\SocketException; 4. Write this code on function of your controller which is in used $msg="Your Password is generate"; $email = new Email('default'); $email ->transport('gmail') ->from(['abcx.com' => 'abcx.com']) ->to($to) ->subject($subject) ->emailFormat('html') ->viewVars(array('msg' => $msg)) ->send($msg); now you can send email from your controller by using this code 5. if this error generate(SMTP server did not accept the password.) then do this process i.> If the tips above didn't help, visit https://www.google.com/accounts/DisplayUnlockCaptcha and follow the steps on the page. ii.> Allow access to your Google account As a security precaution, Google may require you to complete this additional step when signing into a new device or application. To allow access, click the Continue button below. iii.> Account access enabled Please try signing in to your Google account again from your new device or application. 6. run your application 
0
source

Source: https://habr.com/ru/post/1232143/


All Articles