Enviar emails con CodeIgniter 4

Veamos los pasos en CodeIgniter 4 para enviar emails desde un formulario de contacto. Lo haremos de la manera más fiable, que es mediante un servidor SMTP y dejaremos a un lado SendMail que seguro que nos traería problemas.

CodeIgniter 4

Añadimos un nuevo artículo a nuestro listado de tutoriales de CodeIgniter 4

Configuración

Para configurar el envío de emails, deberemos ir a editar el fichero:

/app/Config/Email.php

Dentro de éste, cambiaremos las siguientes variables:

public $protocol = 'smtp';
public $SMTPHost = 'smtp.midominio.com';
public $SMTPUser = 'no-reply@midominio.com';
public $SMTPPass = 'Miser-vidor&74';
public $SMTPPort = 465;
public $SMTPCrypto = 'ssl';

Estas variables son las estrictamente necesarias para enviar el email. Lógicamente, el servidor, el usuario y la contraseña, deben ser las del email que queréis utilizar para enviar los formularios.

Unas cosillas, fijaos que he puesto puerto 465 y encriptación SSL, porque normalmente es lo más extendido en el envío de emails. Si no funciona, deberéis consultar con vuestro proveedor de hosting y preguntarles la configuración del email (puertos, TLS o SSL…)

Controlador

Debéis crear un controlador llamado, por ejemplo /Controllers/contact.php en el que haya dos funciones, el que llama al formulario, y el que envía el mensaje:

Creación del controlador

<?php namespace App\Controllers;

use App\Models\ContactModel;
use CodeIgniter\Controller;

/**
 * Class Contact
 *
 * @package CodeIgniter
 */

class Contact extends BaseController
{

private $email;

// Constructor
public function __construct()
{
	$this->email = \Config\Services::email();
}

// Llamamos a la vista que muestra el formulario
public function index()
{
	$data = [
		'msg'	=> 'Rellena formulario de contacto'
	];
	echo view('contact_view', $data);
}

// Función que envía el email
function sendMail() {

	// Recogemos los datos del formulario
	$subject = $this->request->getPost('asunto');
	$message = $this->request->getPost('mensaje');
	$nombreusuario = $this->request->getPost('nombre');
	$emailusuario = $this->request->getPost('email');

	// Datos el email destino. Donde irá a parar el formulario
	$this->email->setTo("email_destino@midominio.com");

	// Email desde el que se envía (el que hemos configurarado en el apartado anterior)
	$this->email->setFrom("no-reply@midominio.com", "Contacto web");

	$this->email->setSubject($subject);
	$this->email->setMessage($message . $nombreusuario . $emailusuario);

	if ($this->email->send())
	{
		$data = [
			'msg'	=> 'Email enviado correctamente'
		];
	}
	else
	{
		$data = [
			'msg'	=> 'Email No enviado'
		];
	}

	echo view('contact_view', $data);
}

Control errores envío emails

Veamos cómo hacer para que se muestre errores concretos si el envío de emails no se hace correctamente. Sería el mismo código que antes, lo que añadiríamos al mensaje una función, veamos cuál:

<?php namespace App\Controllers;

use App\Models\ContactModel;
use CodeIgniter\Controller;

/**
 * Class Contact
 *
 * @package CodeIgniter
 */

class Contact extends BaseController
{

private $email;

// Constructor
public function __construct()
{
	$this->email = \Config\Services::email();
}

// Llamamos a la vista que muestra el formulario
public function index()
{
	$data = [
		'msg'	=> 'Rellena formulario de contacto'
	];
	echo view('contact_view', $data);
}

// Función que envía el email
function sendMail() {

	// Recogemos los datos del formulario
	$subject = $this->request->getPost('asunto');
	$message = $this->request->getPost('mensaje');
	$nombreusuario = $this->request->getPost('nombre');
	$emailusuario = $this->request->getPost('email');

	// Datos el email destino. Donde irá a parar el formulario
	$this->email->setTo("email_destino@midominio.com");

	// Email desde el que se envía (el que hemos configurarado en el apartado anterior)
	$this->email->setFrom("no-reply@midominio.com", "Contacto web");

	$this->email->setSubject($subject);
	$this->email->setMessage($message . $nombreusuario . $emailusuario);

	if ($this->email->send())
	{
		$data = [
			'msg'	=> 'Email enviado correctamente'
		];
	}
	else
	{
		$data = [
			'msg'	=> 'Email No enviado<br />'. $this->email->printDebugger(['headers'])
		];
	}

	echo view('contact_view', $data);
}

Lo que hemos añadido es la siguiente función que añadiría al mensaje los errores que ha encontrado (no conexión, contraseña incorrecta…):

$this->email->printDebugger(['headers'])

Vista

La vista dependerá en gran medida del framework que utilicéis. Os dejo un ejemplo sencillo y limpio. Lo único en lo que os debéis fijar es en el action del formulario y en el mostrar el mensaje si lo hubiere (el que se le pasa por $data en el controlador). Veamos el fichero

/app/Views/contact_view.php
// Veamos si hay mensaje y lo mostramos
<?php
if ( $msg != "" ){
	echo "<div>". $msg ."</div>";
}
?>

<h1>Formulario de contacto</h1>
<form action="<?php echo base_url(); ?>/contact/sendMail" method="post">

<input type="text" id="nombre" name="nombre" placeholder="Nombre">
<input type="text" id="email" name="email" placeholder="Email">
<input type="text" id="asunto" name="asunto" placeholder="Asunto">
<textarea name="mensaje" id="mensaje" cols="50" rows="5"></textarea>
<button type="submit">Enviar</button>
</form>

Fijaos que el formulario se envía al controlador contact, función sendEmail.

A priori parece complicado, pero si tenéis conceptos de CodeIgniter, no tiene que ser complicar a partir de ahora, enviar emails con CodeIgniter. Eso si, faltaría el tema de la seguridad… eso será en otro artículo.


Más información