lunes, 9 de septiembre de 2013

Enviar un email con CodeIgniter

Hoy vamos a ver cómo enviar un email con CodeIgniter, para enviar un email necesitariamos un
servidor de correo, pero hay una manera más fácil de hacer esto y es usando alguna cuenta de Gmail que tengamos.

Si queremos tener disponible la configuración para el envio de los emails desde cualquier controlador
necesitamos crear un archivo de llamado email.php en la carpeta config, de lo contrario sería
necesario especificarlo en cada controlador desde el que necesitemos enviar algún email. Para este
ejemplo a la aplicación la llamaremos ci_email y vamos a suponer que alguién llena un formulario con
sus datos y posteriormente el mensaje que envio llega a su propia cuenta de correo.

Paso 1
vamos a ci_email/application/config/ y creamos un archivo llamado email.php; de este modo ya no tendremos que inicializar la configuración ni estarla definiendo en alguna otra parte.

Código de email.php


<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

            $config['protocol'] = 'smtp';  // protocolo de envio de correo
            $config['smtp_host'] = 'ssl://smtp.googlemail.com'; // dirección SMTP del servidor                              
            $config['smtp_user'] = 'mi-correo@gmail.com'; // remplazarlo por un cuenta real de Gmail - usuario SMTP
            $config['smtp_pass'] = 'mi-password'; 
            $config['smtp_port'] = '465'; // o el '587' --  Puerto SMTP 
            $config['smtp_timeout'] = '6';  // Tiempo de espera SMTP(segundos)
            //$config['email']['newline']  = '\r\n';
            $config['mailtype'] = 'html'; // o text para texto sin HTML

Paso 2
vamos a ci_email/application/controllers/ y    creamos un controlador y lo llamamos email_controller.php; aquí es donde se validan los datos del formulario antes de enviar el correo.

Código de email_controller.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Email_controller extends CI_Controller {

    function __construct() {
        parent::__Construct();
        $this->load->library(array('form_validation','email'));
        $this->load->helper(array('url','html'));
       }

function index(){
       
       $data['title'] = 'Formulario de Contacto';
       $data['msg'] = NULL;
     
       $this->form_validation->set_rules('name', 'Nombre', 'required|alpha|min_length[3]');
       $this->form_validation->set_rules('phone', 'Celular', 'required|numeric');
       $this->form_validation->set_rules('address', 'Ciudad y dirección', 'required');
       $this->form_validation->set_rules('email', 'Email', 'required|valid_email');  
       $this->form_validation->set_rules('message', 'Mensaje', 'required');  
     
       $this->form_validation->set_message('required', 'el campo %s es requerido');
       $this->form_validation->set_message('valid_email', 'El email no es válido');
         
           $this -> form_validation -> set_error_delimiters('<ul><li>', '</li></ul>');
     
       $this->form_validation->set_message('required', 'el campo %s es requerido');
       $this->form_validation->set_message('valid_email', 'El email no es válido');
         
           $this -> form_validation -> set_error_delimiters('<ul><li>', '</li></ul>');
      
      
    if ($this->form_validation->run() == FALSE)
        {
            $this->load->view('send_email', $data); 

          
            }else{
                      
            $name = $this->input->post('name');
            $mobil = $this->input->post('phone');
            $email = $this->input->post('email');
            $message = $this->input->post('message');
                      
        // Datos para enviar el correo
            $this->email->from('ejemplo@gmail.com', 'Ejemplo');
            $this->email->to($email);
            $this->email->subject('Email enviado con CI y Gmail');              
            $this->email->message($message);
          
            if($this->email->send()){
          
            $data['title']='Mensaje Enviado';
            $data['msg'] = 'Mensaje enviado a su email';
                     // echo $this->email->print_debugger(); exit;                            
            $this->load->view('send_email', $data);
          
             }else{
                $data['title']='El mensaje no se pudo enviar';
                $this->load->view('send_email', $data);
            
             }
                        
           }
        }
    }


Paso 3
creamos una vista en ci_email/application/views/ con el nombre de send_mail.php

Codigo de send_mail.php

<!DOCTYPE html>
<html>   
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title><?php echo $title;?></title>
<style type="text/css">
body {
    margin: 0px; color: #444;
    background-color: #ffffff;
    font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size: 11px; padding-top: 20px; padding-bottom: 20px;}
   
#container{
    -moz-border-radius: 10px;
    -khtml-border-radius: 10px;
    -webkit-border-radius: 10px;
    border-radius: 10px; border: 1px solid #ccc; padding: 20px;
    width:500px;     margin-left: auto; margin-right: auto;
    padding-top:3px; padding-bottom: 2px;} 
  
h1, h2, h3, h4, h5, h6 {font-weight: bold;color: #21759b;}

#content{
width: 790px;padding:5px; min-height:400px;}

#form_email{
    width:500px;
    border: 1px solid #E5E5E5;
    box-shadow: 0 2px 3px #C8C8C8;
    margin-top: 20px;
    margin-bottom:20px; padding: 16px;
    width: 420px;
}
#error{
    width:400px;
    border: 1px solid #bf0100;
    background-color: #FFEBE8;
    margin: 5px 30px 10px 30px;

}
</style>
</head>
<body>
<div id="container">
<div>
    <h1><?php echo $title;?></h1>
</div>
<?php if(validation_errors()){ ?>
   
    <div id="error"><?php echo validation_errors();?></div>
   
<?php  } // fin del if que evalua los errores del formulario

  $attributes = array('id' => 'form_email');
 
   if($msg===NULL){
     
 echo form_open('email_controller', $attributes);

       $name = array('name'=>'name', 'id'=>'name','placeholder'=>'Nombre','value'=>set_value('name'), 'size'=> '35',);
       $phone = array('name'=>'phone', 'id'=>'phone','placeholder'=>'Teléfono','value'=>set_value('phone'), 'size'=> '35',);
       $address = array('name'=>'address','id'=>'address','placeholder'=>'Ciudad y dirección','value'=>set_value('address'), 'size'=> '35',);
       $email = array('name'=>'email', 'id'=>'email','placeholder'=>'Email', 'value'=>set_value('email'), 'size'=> '35',); 
       $message =array('name'=>'message', 'cols'=>'50', 'id'=>'message','placeholder'=>'Mensaje...','value'=>set_value('message'),);
 ?>
      <div><?php echo form_label('Nombre');?></div>
             
      <div><?php echo form_input($name);?></div>
      <div><?php echo form_label('Teléfono');?></div>  
      <div><?php echo form_input($phone);?></div>
      <div><?php echo form_label('Ciudad y direccción');?></div> 
      <div><?php echo form_input($address);?></div>
      <div><?php echo form_label('Email');?></div>
      <div><?php echo form_input($email);?></div>
      <div><?php echo form_label('Mensaje');?></div>
      <div><?php echo form_textarea($message)?></div>    
<div>
    <?php echo form_submit('submit', 'Enviar');?> 
</div>
<?php echo form_close();?> 

 <?php }else
           { echo anchor('email_controller','Enviar otro mensaje').br(2);
       }?>
</div>
</body>
</html>


Último paso
vamos a ci_email/application/config/ abrimos routes.php y cambiamos el controlador que cargará
al iniciar la aplicación en la linea 41

$route['default_controller'] = "email_controller";

Descargar archivos

4 comentarios :

  1. Buenas! Gracias por el aporte!!! Me sirve muchísimo, pero me da error de librería

    ResponderBorrar
    Respuestas
    1. Este blog ha sido eliminado por un administrador de blog.

      Borrar
  2. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
  3. Erica, si te da error de librería, prueba con agregar lo que te indican estas líneas
    $this->load->library(array('form_validation','email'));
    $this->load->helper(array('url','html'));

    en el archivo autoload, tanto en el array library como el de helper.

    ResponderBorrar