2015-09-23 44 views
5

próbuję wysłać wiadomość e-mail weryfikacyjny przy użyciu Gmaila, ale ja dostać ten błąd:CakePHP 3 błąd podczas próby wysłania wiadomości e-mail z gmail

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)

Śledzę instrukcji Configuring Transports.

Email::configTransport('gmail', [ 
    'host' => 'ssl://smtp.gmail.com', 
    //'host' => 'smtp.gmail.com', 
    'port' => 465, 
    'username' => '[email protected]', 
    'password' => 'password', 
    'className' => 'Smtp', 
    'log'=>true, 
    //'tls' => true 
]); 

$correo = new Email(); 
$correo 
    ->transport('gmail') 
    ->template('registro_exito') 
    ->emailFormat('html') 
    ->to('[email protected]') 
    ->from('[email protected]') 
    ->viewVars([ 
    'nombre_sitio_secundario'=>$nombre_sitio_secundario, 
    'usuario_id'=>$usuario_id, 
    'token'=>$token 
    ]) 
    ->send(); 

I to jest kompletny dziennik błędów:

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, '[email protected]') 
#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} 

Warto wspomnieć, że OpenSSL es pozwoliły na php i również mam umożliwiło „dostęp dla mniej bezpiecznych aplikacji” na configs Gmail.

Dzięki za pomoc !.

Odpowiedz

11

Ok znalazłem "błąd". Właściwie, kod jest w porządku, problem dotyczy OpenSSL w php 5.6, który weryfikuje każde zaszyfrowane połączenie domyślnie, ALE mój lokalny Lampp nie liczy się z certyfikatem ssl i to powoduje błąd.

Rozwiązaniem jest unikanie weryfikacji, więc kod configTransport byłoby tak:

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

wziąłem jako odniesienie PHPMailer answer ale to było trochę wyzwanie wiedząc, jak ją stosować do Cakephp3.

Mam nadzieję, że te informacje będą pomocne dla kogoś innego.

+0

Awesome. Dzięki za to! – Battousai

+0

Weryfikacji można uniknąć tylko na poziomie lokalnym w trakcie opracowywania. Musi być aktywny przy produkcji. –

0
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' => '[email protected]', //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 
+1

Proszę sformatować poprawnie. – Blackbam