Correos mediante CakePhp 2.x

301 views
Skip to first unread message

detectivejd

unread,
Sep 4, 2015, 9:15:33 PM9/4/15
to CakePHP en Español
Hola a todos, quería preguntarles lo siguiente: 

Quiero hacer una parte del sistema dónde el usuario pueda mandarle correos a una cierta persona, desde que me diga esto:

Nombre: -----------------------------------

Correo: -----------------------------------

Asunto: -----------------------------------

Consulta: ---------------------------------

|Enviar|

y una vez que escribo dichos datos, y hacemos click en Enviar, que se le envié el correo al correo que le pasamos por defecto.

Aquí pongo el código:

public function contactenos(){
        $this->Email->from = 'cora...@gmail.com'; // esto es para probar
        $this->Email->to = 'cora...@gmail.com'; // esto es para probar
        $this->Email->subject = 'Mensaje de Prueba';
        $this->Email->template = 'Hola';
        $this->Email->send();
    }

pero me sale este error:

Error: The view for PagesController::contactenos() was not found.

Confirm you have created the file: Emails/text/hola.ctp in one of the following paths:

  • /opt/lampp/htdocs/CheloMountain/app/View/Emails/text/hola.ctp

Notice: If you want to customize this error message, create app/View/Errors/missing_view.ctp


Espero su respuesta y saludos.

Jorge

unread,
Sep 5, 2015, 7:00:51 AM9/5/15
to cakep...@googlegroups.com

Hola

Has comprobado lo que te indica el mensaje de error ?

Un saludo

--
Has recibido este mensaje porque estás suscrito al grupo "CakePHP en Español" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a cakephp-esp...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/cakephp-esp.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Juandy Ocampo

unread,
Sep 5, 2015, 8:26:06 PM9/5/15
to cakep...@googlegroups.com
Hola, mira que lo intenté, cambié el hola por el default.ctp y me sale esto:

Error: An Internal Error Has Occurred.

Me olvidé de mencionarlo antes pero es la primera vez que hago esto de los correos, y en especial en cakephp, he visto algunos tutoriales sobre correos en cakephp, pero no logro darle al clavo.

Espero sus respuesta y saludos.

detectivejd

unread,
Sep 6, 2015, 8:58:56 PM9/6/15
to CakePHP en Español
Hola a todos, verán estuve tocando el código y tengo lo sgte:

en mi vista: View/Pages/contactenos.ctp

<div class="container">
    <div class="row">
        <div class="col-md-6">
            <fieldset>
                <legend>Contactenos</legend>
                <?php 
                    echo $this->Form->create('Page');
                        echo $this->Form->input('nombre', array('label'=>'Nombre: '));
                        echo $this->Form->input('correo', array('label'=>'Correo: '));
                        echo $this->Form->input('asunto', array('label'=>'Asunto: '));
                        echo $this->Form->input('mensaje', array('type'=>'textarea','label'=>'Mensaje: '));
                    echo $this->Form->end('Enviar'); 
                ?>
            </fieldset>
        </div>
    </div>
</div>

y en mi controlador: Controller/PagesController.php

public function contactenos(){
        if ($this->request->is('post')) {
            $this->Email = new CakeEmail();
            $this->Email->from($this->request->data['Page']['correo']);
            $this->Email->to('cora...@gmail.com');
            $this->Email->subject($this->request->data['Page']['asunto']);        
            $this->Email->send($this->request->data['Page']['mensaje']);         
        }
    }

lo probé, pero el mismo error pero cambia la descripción:

Error: An Internal Error Has Occurred.

Stack Trace

 Y aquí es mi confusión xq no sé cómo solucionarlo, el error parece estar en el send de Email pero ¿dónde está la falla?

Espero sus respuestas y saludos.

Miguel Somar

unread,
Sep 6, 2015, 9:05:03 PM9/6/15
to CakePHP en Español
App::uses('CakeEmail', 'Network/Email');
$Email = new CakeEmail();
$Email->from(array('m...@example.com' => 'My Site'));
$Email->to('y...@example.com');
$Email->subject('About');
$Email->send('My message');
Solo copia y pega eso pero ajustando a tu remitente y destino. nada mas debe funcionar. Ahora depende como estés tratando de enviar si lo envías por STMP y lo configuras en cake así
class EmailConfig {
    public $gmail = array(
        'host' => 'smtp.gmail.com',
        'port' => 465,
        'username' => 'm...@gmail.com',
        'password' => 'secret',
        'transport' => 'Smtp',
        'tls' => true
    );
}
o si utilizas algo como Mercury que viene con el XAMPP, de ser así debes configurar el correo para que envíes de manera local.Esto de email es algo sencillo. Ademas copia y pega lo que te da el log para ver que falla. pero viendo el error es que esta mal configurado tu correo de salida el que envía los emails.





--

Juandy Ocampo

unread,
Sep 6, 2015, 11:08:34 PM9/6/15
to cakep...@googlegroups.com
hola Miguel, gracias x responder, verás intenté lo que me dijiste lo del controlador:

public function contactenos(){
        if ($this->request->is('post')) {
            $Email = new CakeEmail();
            $Email->from(array($this->request->data['Page']['correo'] => 'My Site'));
            $Email->to('cora...@gmail.com');
            $Email->subject($this->request->data['Page']['asunto']);
            $Email->send($this->request->data['Page']['mensaje']);                    
        }        
    }

pero me indica el mismo error, lo de la clase EmailConfig no había tocado nada xq no sé cómo usarlo, quería preguntarte, el hecho de que use linux mint no le afecta que de ese error ¿verdad?

viendo los errores, me marca en el send, pero ¿dónde rayos esta el error o que me falta? xq lo q quería era que cuando el usuario escriba su nombre, correo (un correo cualquiera, ya sea gmail, hotmail, outlook, el que sea), asunto y el mensaje además de hacer click en Enviar se enviara el correo, pero no sé me ocurre nada.

detectivejd

unread,
Sep 9, 2015, 12:24:05 AM9/9/15
to CakePHP en Español
Hola a todos, verán no estoy usando mercury ya que el xampp de linux no viene con mercury, yo q estoy usando es thunderbird, pero el error es el mismo:

Error: An Internal Error Has Occurred.

Stack Trace

    el código es este:

    public function contactenos(){
            if ($this->request->is('post')) {
                $Email = new CakeEmail();           
                $Email->from(array($this->request->data['Page']['correo'] => 'My Site'));
                $Email->to('cora...@gmail.com');
                $Email->subject($this->request->data['Page']['asunto']);
                $Email->send($this->request->data['Page']['mensaje']);           
            }        
        }
     
    xq quiero que el usuario ingrese su correo para enviar el correo a un correo a enviar x defecto, pero me da ese error, por favor, alguien puede responderme? Gracias.

    Saludos.

    Pd: disculpen mi lentitud, pero es que no me doy cuenta de mi error. 

     

    detectivejd

    unread,
    Sep 12, 2015, 11:40:08 PM9/12/15
    to CakePHP en Español
    Hola a todos, verán estuve mirando y logré andar el thunderbird ya q tenía un error..... y cambié mi configuración en EmailConfig.php quedándome así:

    class EmailConfig {
    public $gmail = array(
                'host' => 'ssl://smtp.gmail.com',
                'port' => 465,
                'username' => 'server2...@gmail.com',
                'password' => 'j1990d21',
                'transport' => 'Smtp'
            );
    }

    y en mi controlador PagesController.php:

    public function contactenos(){
            if ($this->request->is('post')) {
                $Email = new CakeEmail('gmail');           
                $Email->from(array($this->request->data['Page']['correo'] => 'My Site'));
                $Email->to('cora...@gmail.com');
                $Email->subject($this->request->data['Page']['asunto']);
                $Email->send($this->request->data['Page']['mensaje']);           
            }        
        }

    pero ahora me da este sgte error:

    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)

    Error: An Internal Error Has Occurred.

    Stack Trace

      tengo xampp en linux, pero no tiene mercury, ya que uso thunderbird, pero no sé cómo solucionar este error, necesito su ayuda.

      detectivejd

      unread,
      Sep 13, 2015, 10:04:55 PM9/13/15
      to CakePHP en Español
      Solucioné un poco el error, pero ahora me sale esto:

      PHP Startup: Unable to load dynamic library '/opt/lampp/lib/php/extensions/no-debug-non-zts-20131226/php_openssl.so' - /opt/lampp/lib/php/extensions/no-debug-non-zts-20131226/php_openssl.so: no se puede abrir el archivo del objeto compartido: No existe el archivo o el directorio


      por favor alguna respuesta, la que sea, necesito terminar esta parte de la página... Saludos 

      detectivejd

      unread,
      Sep 18, 2015, 9:27:14 PM9/18/15
      to CakePHP en Español
      Hola a todos, les cuento que pude hacer envie el correo a otro por defecto, tuve que borrar xampp e instalar apache, mysql y phpmyadmin de forma independiente, luego instalé postfix y cuando quise acordar anduvo, pero ahora tengo la siguiente pregunta que hacer:

      ¿cómo puedo hacer para que cuando el que recibió el correo le responda el que se lo mandó? porque sucede que cuando respondo este se lo manda al correo de uso cómo servidor

      código:

      email.php

      <?php
      class EmailConfig 
      {        
          public $default = array(
      //'transport' => 'Mail',
      //'from' => 'you@localhost',
      //'charset' => 'utf-8',
      //'headerCharset' => 'utf-8',
          );       
          public $gmail = array(
              'host' => 'ssl://smtp.gmail.com',
              'port' => 465,
              'username' => 'server2...@gmail.com',
              'password' => 'j1990d21',
              'transport' => 'Smtp'
          );


      PagesController.php

      <?php
      //use CakeEmail;
      App::uses('AppController', 'Controller');
      App::uses('CakeEmail', 'Network/Email');
      class PagesController extends AppController 
      {
          public $uses = array();
          var $components = array('Email');
          /*---------------------------------------------------*/
          public function beforeFilter() {
              parent::beforeFilter();
              $this->Auth->allow();
          }
          public function contactenos(){
              if ($this->request->is('post')) {
                  $Email = new CakeEmail('gmail');     
                 // $this->request->data['Page']['correo'] es el correo que le escribo en la caja de texto, que quiero que me aparezca
                  $Email->from(array($this->request->data['Page']['correo'] => $this->request->data['Page']['nombre']));
                  $Email->to('cora...@gmail.com');
                  $Email->subject($this->request->data['Page']['asunto']);
                  $Email->send($this->request->data['Page']['mensaje']);
                  $this->render('home');
              }        
          }
      }

      Pondré imagenes para explicarme mejor, espero algunas respuestas. 

      Saludos.


      Correo respondido al servidor.png
      Correo mandado del servidor al de por defecto.png

      Pablo

      unread,
      Sep 18, 2015, 9:43:22 PM9/18/15
      to cakep...@googlegroups.com

      replyTo como opcion igual q from.

      Juandy Ocampo

      unread,
      Sep 18, 2015, 11:21:28 PM9/18/15
      to cakep...@googlegroups.com
      Mil gracias, resolví el problema con el replyto cómo dijiste, y me quedó así:

      public function contactenos(){
              if ($this->request->is('post')) {
                  $Email = new CakeEmail('gmail');           
                  $Email->from(array('server2...@gmail.com' => $this->request->data['Page']['nombre'])); 
      // parece que el from es obligatorio, sólo que este funciona con el correo que le configuré en el email.php como servidor
                  $Email->replyTo($this->request->data['Page']['correo']);
                  $Email->to('cora...@gmail.com');
                  $Email->subject($this->request->data['Page']['asunto']);
                  $Email->send($this->request->data['Page']['mensaje']);
                  $this->render('home');
              }        
          } 

      quería preguntar para en un futuro si se puede, el hecho de adjuntar archivos en un correo, digo xq en esta aplicación de momento no es necesario, pero estaría bueno saberlo. 

      Saludos y Gracias por las ayudas, que me sirvieron en esta ocasión.

      Pablo

      unread,
      Sep 20, 2015, 10:23:30 AM9/20/15
      to cakep...@googlegroups.com

      http://book.cakephp.org/2.0/en/core-utility-libraries/email.html

      Esa es toda la data. Fijate q muestar como cargar un attach.

      --
      Reply all
      Reply to author
      Forward
      0 new messages