php - 尝试使用 gmail 发送电子邮件时出现 Cakephp 3 错误

标签 php email ssl gmail cakephp-3.0

我正在尝试使用 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)

我已经关注了 Configuring Transports指导。

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(); 

这是完整的错误日志:

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}

值得一提的是,在 php 上启用了 openssl es,而且我还在 Gmail 配置上启用了“访问安全性较低的应用程序”。

感谢您的帮助!

最佳答案

好的,我找到了“错误”。实际上代码很好,问题出在OpenSSL在默认情况下验证每个加密连接的 php 5.6 中,但我的本地 Lampp 不计入 ssl 证书,这会导致错误。

解决方案是避免验证,所以configTransport代码是这样的:

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

我引用了 PHPMailer answer但是知道如何将它应用到 Cakephp3 有点挑战。

希望这些信息对其他人有所帮助。

关于php - 尝试使用 gmail 发送电子邮件时出现 Cakephp 3 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32749084/

相关文章:

php - 激活 PHP 的 OCI8/Oracle 扩展 - 错误(未找到)

phpmailer 无法发送邮件

javascript - 将颜色更改为不同的 php 结果

php - MySQL 按前 10 名排序

swift - 是否可以在 MFMailcomposeViewController swift 中选择登录的电子邮件帐户?

linux - 询问收件人、主题和正文的 Bash 邮件脚本

go - 在 Go 中升级到 TLS 的连接

ssl - 如何使用 mup 在一个 digitalocean 液滴上正确部署带有 SSL 的多个 meteor 实例?

asp.net - 如何关闭 Azure 网站中的 302 重定向

php - 动态 JavaScript 表单,无 HTML 表单