Envío de correos o emails con CodeIgniter 3, guía rápida

15-05-2017 - Andrés Cruz

Envío de correos o emails con CodeIgniter 3, guía rápida

En esta entrada veremos cómo enviar correos con el framework CodeIgniter, CodeIgniter ofrece una gran librería de manera nativa para trabajar con el envío de correo, la misma permite enviar emails simples sin realizar configuraciones sobre el servidor SMTP, realizando configuraciones para poder emplear el servidor SMTP al 100%, e incluso un modo debugging para la impresión de posibles errores en configuración, y envío de correos en general; además permite el envío de correos en formato HTML; hoy veremos en detalle cada uno de los escenarios anteriores.

Por supuesto, para que funcione el envío de correos debe de tener configurado un servidor de correos en su máquina o emplear el de algun hosting como iPage, Godaddy, Hostgator, etc.

Envío de correo simple con CodeIgniter

El envío de correo más sencillo que podemos realizar con CodeIgniter está configurado de la siguiente manera:

public function email() {
	$CI = & get_instance();
	$CI->load->helper('url');
	$CI->load->library('session');
	$CI->config->item('base_url');

	$CI->load->library('email');

	$subject = 'Bienvenido a mi app';

	$msg = 'Mensaje de prueba';

	$CI->email
		->from('barackobama@gmail.com')
		->to($email)
		->subject($subject)
		->message($msg)
		->send();
}

El inconveniente con este método, como podemos apreciar es que podemos colocar lo que queramos para el parámetro de from y es muy posible que los motores de correo etiqueten estos mensajes como SPAM al ser recibidos ya que no están siendo enviados desde la cuanta reflejada en dicho campo from además de que no todos los hosting permiten el envío de correos de tal forma.

Envío de correo con configuración en CodeIgniter

Esta sería el formato más adecuado para enviar correos con CodeIgniter, ya que configuramos todo lo necesario para tal fin; para eso definimos una variable config con los siguientes parámetros:

public function email() {

    $config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'smtp.1and1.com',
        'smtp_port' => 25,
        'smtp_user' => 'barackobama@misitio.com',
        'smtp_pass' => '12345',
        'charset' => 'utf-8',
        'priority' => 1
    );

    $CI = & get_instance();
    $CI->load->helper('url');
    $CI->load->library('session');
    $CI->config->item('base_url');

    $CI->load->library('email');

    $CI->email->initialize($config);

    $subject = 'Bienvenido a mi app';

    $msg = 'Mensaje de prueba';

    $CI->email
            ->from('barackobama@gmail.com')
            ->to($email)
            ->subject($subject)
            ->message($msg)
            ->send();
}

En la variable config especificamos elementos como el protocolo, el nombre del servidor SMTP, el puerto del servidor SMTP, el nombre de la cuenta, la contraseña de la cuenta, la codificación, la prioridad, etc; puedes consultar la lista completa en el siguiente enlace: CodeIgniter Email Class

Es importante notar que si estamos trabajando con un servidor web, hay parámetros que nos deben dar ellos que seguramente estan en algun apartado del CPanel; por ejemplo el de smtp_host en donde indicamos el servidor SMTP que vamos a emplear, también otros datos como smtp_port que debes de indicar el puerto.

smtp_user y smtp_pass user debes de especificar la dirección de email y password que vas a utilizar, la prioridad priority es simplemente una bandera, que por ejemplo Google toma en cuenta al momento de posicionar el correo en alguno de sus paneles:

gmail panel email

Por último las funciones message y subject en donde especificamos el asunto y cuerpo del contenido; si quieres que el contenido a enviar sea HTML debes de realizar los siguientes cambios:

$msg =  $CI->load->view('email/recuperar_cuenta', $data, TRUE);

***

$CI->email->from('barackobama@gmail.com')
		->to($email)
		->subject($subject)
		->message($msg)
		->set_mailtype('html')
		->send();

De esta forma, con el tercer parámetro establecido en TRUE le estamos diciendo a CodeIgniter que devuelva el contenido de la vista y la guardamos en una variable, luego el método set_mailtype lo establecemos como HTML.

Como puedes ver, estos parámetros indicados en la variable config depende en gran medida de la configuración que emplee su hosting y deben preguntar por los mismos a su hosting en caso de no estar en su panel.

Envío de correos con formato HTML en CodeIgniter

Hasta ahora se ha mostrado cómo enviar correos sin formato, es decir puro texto, veamos cómo enviar un correo con formato HTML; para ello:

public function email() {
    $CI = & get_instance();
    $CI->load->helper('url');
    $CI->load->library('session');
    $CI->config->item('base_url');

    $CI->load->library('email');

    $subject = 'Bienvenido a mi app';

    $msg = $CI->load->view('email/vista', $data, true);

    $CI->email
            ->from('barackobama@gmail.com')
            ->to($email)
            ->subject($subject)
            ->message($msg)
            ->set_mailtype('html')
            ->send();
}

$CI->load->view con el parámetro true permite obtener o retornar el código fuente de la vista, la cual establecemos en el parámetro message.

Debugging al momento del envío de los emails

En caso de ocurrir algún error en los parámetros de configuración es muy útil el llamado e impresión de esta función, la misma nos provee de más datos como error en las credenciales del correo, si el servidor existe o no, etc; muy útil al momento de configurar nuestra función de envío de correos:

public function email() {

$config = Array(
'protocol' => 'smtp',
'smtp_host' => 'smtp.1and1.com',
'smtp_port' => 25,
'smtp_user' => 'barackobama@gmail.com',
'smtp_pass' => '12345',
'charset' => 'utf-8',
'wordwrap' => true,
'priority' => 1
);

$CI = & get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');

$CI->load->library('email');

$subject = 'Bienvenido a mi app';

$msg = 'Mensaje de prueba';

$CI->email
->from('barackobama@gmail.com')
->to($email)
->subject($subject)
->message($msg)
->send();

echo $CI->email->print_debugger();

}

Atachar archivos en los correos

Por último mostramos cómo podemos atachar múltiples archivos o un archivo (remover el foreach en un email):

$path = realpath('proyectos/archivos/'); foreach ($archivos_proyecto as $archivo_proyecto) {    var_dump($path . $archivo_proyecto->archivo);    $CI->email->attach($path . '/' . $archivo_proyecto->archivo); }

Necesitamos el verdadero path o path completo de los archivos que deseamos adjuntar, y por eso empleamos la función provista por la API de PHP realpath, si el archivo no existe, simplemente no se adjuntará al momento de enviar el email.

Por supuesto puedes combinar entre sí las distintas secciones que vimos anteriormente según sea lo que amerite.

Extra: enviar emails en CodeIgniter con Gmail y Yahoo

El siguiente código muestra como enviar correos con Gmail y/o Yahoo lo cual puede no ser siempre la mejor opción ya que los hosting tienden a bloquear el acceso a estos servicios pero de igual forma les dejo el código:

 //configuracion para gmail

 $config = array(
 'protocol' => 'smtp',
 'smtp_host' => 'ssl://smtp.gmail.com',
 'smtp_port' => 465,
 'smtp_user' => 'mi_correo_gmail@gmail.com',
 'smtp_pass' => 'password',
 'mailtype' => 'html',
 'charset' => 'utf-8',
 'newline' => "\r\n"
 ); 
//configuracion para yahoo
$configYahoo = array(
 'protocol' => 'smtp',
 'smtp_host' => 'smtp.mail.yahoo.com',
 'smtp_port' => 587,
 'smtp_crypto' => 'tls',
 'smtp_user' => 'mi_correo_yahoo@yahoo.com',
 'smtp_pass' => 'password',
 'mailtype' => 'html',
 'charset' => 'utf-8',
 'newline' => "\r\n"
 ); 
Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.