Como enviar email desde un módulo en PrestaShop 8

Enviar emails desde una aplicación siempre es interesante pero más aún lo es en un entorno Ecommerce.

En este caso, puedes enviar emails para notificar a tus clientes de tus novedades, dar la bienvenida o informar de los detalles de su pedido.

Estos son ejemplos de emails que ya envía la plataforma PrestaShop, por ejemplo, pero es posible que necesites enviar email en otros contextos específicos.

En este tutorial vas a aprender como enviar un email desde un módulo en PrestaShop 8 usando PHP ya sea desde el archivo principal, desde un controlador de front o desde un controlador de back.

Función para enviar email desde PrestaShop

Para enviar emails en PrestaShop hay varias opciones, puedes usar la función mail de PHP, alguna clase ya prediseñada como PHPMailer o cualquier otra opción pero lo más recomendable es usar la función Mail::send() que incluye el Core de PrestaShop.

La clase Mail es una clase del Core de PrestaShop que extiende de ObjectModel y dentro de ella está el método Send() que justamente permite enviar un correo electrónico a un destinatario.

Mail::send() tiene los siguientes parámetros:

  • Identificador del idioma
  • Nombre de la plantilla
  • Título del mensaje
  • Variables de la plantilla si tuviera
  • Para quien va dirigido el mensaje, dirección de correo electrónico
  • Para quien va dirigido el mensaje, en este caso, el nombre del destinatario
  • Email del destinatario
  • Nombre del destinatario
  • Archivo adjunto
  • Modo smtp (deprecated)
  • Ruta de la plantilla de email

Esta función tiene algunos parámetros más pero son opcionales y no los vamos a mencionar en este tutorial debido a su poco uso.

Para darle un vistazo al resto de parámetros, puedes entrar en el fichero classes/Mail.php y buscar el método send() o ver lo que dice la documentación oficial al respecto:

https://devdocs.prestashop-project.org/1.7/development/mail/

¿Cómo crear la plantilla HTML personalizada?

Para el envío de email en PrestaShop, se requiere de una plantilla HTML y otra de texto plano con formato TXT.

En tu módulo debes crear la subcarpeta mails/ y dentro una subcarpeta por código iso del idioma.

Por ejemplo:

  • Para el idioma español crearíamos los siguientes ficheros: mails/es/tuplantilla.html y mails/es/tuplantilla.txt
  • Para el idioma inglés crearíamos los siguientes ficheros: mails/en/tuplantilla.html y mails/en/tuplantilla.txt

Fíjate que lo único que cambia en la ruta es el código iso del idioma.

Es importante crear 2 ficheros, uno con el contenido del email en formato HTML y otro en formato de texto plano. De esta forma, tendrás en cuenta los formatos con los que se puede configurar el envío de email desde tu tienda PrestaShop.

Para rellenar el contenido de estas plantillas yo te recomendaría que cojas una plantilla cualquiera de las que ya tiene PrestaShop en su carpeta mails/ para copiarla y modificarla según tus intereses. De esta forma, mantienes el mismo formato para todos los emails de la tienda.

Llamada a la función de envío de email desde el archivo principal de un módulo

Plantéate la necesidad de enviar mensajes o newsletters a tus clientes desde la administración de tu tienda.

Un formulario donde puedas elegir a que grupo de clientes o a que cliente quieres enviar el mensaje, establecer un título del mensaje y un contenido.

Al pulsar el botón enviar, podríamos hacer la llamada a la función Send() de la siguiente forma:

$iso = Language::getIsoById($this->context->language->id);
$template = 'message';
 
if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$template.'.txt') && file_exists(dirname(__FILE__).'/mails/'.$iso.'/'.$template.'.html')) {
    $subject = Tools::getValue('subject');
    $message = Tools::getValue('message');
    $id_customer = Tools::getValue('id_customer');
    $customer = new Customer($id_customer);
    $id_lang = $customer->id_lang;
 
    $template_vars = array(
        '{message}' => $message,
        '{shop_name}' => Configuration::get('PS_SHOP_NAME'),
    );
 
    Mail::Send(
        $id_lang,
        $template,
        $subject,
        $template_vars,
        $customer->email,
        $customer->firstname.' '.$customer->lastname,
        Configuration::get('PS_SHOP_EMAIL'),
        Configuration::get('PS_SHOP_NAME'),
        null,
        null,
        dirname(__FILE__).'/mails/'
    );
}

En primer lugar puedes identificar el código iso del contexto y la definición de la plantilla de email que vamos a utilizar.

Si el template existe y tiene definido sus 2 archivos, tanto el .html como el .txt, usando el método estático getValue de la instancia Tools pasándole como parámetro el nombre de la variable POST, estamos recibiendo los 3 parámetros del formulario: A que cliente se va a enviar, el título y el mensaje.

Puedo crear una instancia del cliente elegido con el objetivo de sacar de la base de datos su nombre completo, email e idioma preferido.

Con la variable $template_vars, simplemente estoy creando un array con las variables que deseo pasar a la plantilla de email con el fin de poder dinamizar el contenido en función del mensaje que deseo enviar.

Y, después de definir las variables, ya puedes llamar al método estático Send() de la instancia Mail con todos sus parámetros.

Llamada a la función de envío de email desde un controlador de un módulo

Si te ves en la necesidad de enviar un email desde un controlador de un módulo, ya sea un controlador de back o de front, déjame decirte que debes hacerlo de la misma manera que para el archivo principal.

Solo hay dos detalles que debes tener en cuenta y son las rutas de los ficheros del condicional que verifica si las plantillas existen y el último parámetro de la función Send() que hace referencia también a la ruta donde están ubicadas las plantillas de email.

Teniendo en cuenta el código de ejemplo anterior, en el contexto de un controlador de un módulo quedaría así:

$iso = Language::getIsoById($this->context->language->id);
$template = 'message';
 
if (file_exists(dirname(__FILE__).'/../../mails/'.$iso.'/'.$template.'.txt') && file_exists(dirname(__FILE__).'/../../mails/'.$iso.'/'.$template.'.html')) {
    $subject = Tools::getValue('subject');
    $message = Tools::getValue('message');
    $id_customer = Tools::getValue('id_customer');
    $customer = new Customer($id_customer);
    $id_lang = $customer->id_lang;
 
    $template_vars = array(
        '{message}' => $message,
        '{shop_name}' => Configuration::get('PS_SHOP_NAME'),
    );
 
    Mail::Send(
        $id_lang,
        $template,
        $subject,
        $template_vars,
        $customer->email,
        $customer->firstname.' '.$customer->lastname,
        Configuration::get('PS_SHOP_EMAIL'),
        Configuration::get('PS_SHOP_NAME'),
        null,
        null,
        dirname(__FILE__).'/../../mails/'
    );
}

Simplemente cambia la ruta de acceso al directorio de emails y la ubicación de los ficheros de la plantilla de email teniendo en cuenta la ubicación física del controlador que, por normal general, suele estar en tumodulo/controllers/front/tucontrolador.php.

¿Cómo enviar mensajes a tus clientes desde tu tienda PrestaShop?

Afortunadamente para ti, tenemos un módulo gratuito que te va a servir perfectamente para enviar emails a tus clientes desde tu tienda.

También te puede servir de guía o base para crear tu código para enviar un email.

El módulo es bastante simple de utilizar. Desde su configuración puedes elegir a quien vas a enviar el mensaje, un título y el mensaje (puede ser en formato HTML).

Enviar email a tus clientes desde PrestaShop

Puedes enviar un mensaje a un cliente en concreto, a un grupo de clientes, a todos los clientes, solo a los clientes suscritos a la newsletter o, incluso, a un empleado.

Enviar newsletter a tus clientes desde PrestaShop

Si necesitas algo más avanzado, también podrías probar el Boletín de correo PRO. Este módulo te va a permitir enviar mensajes o boletines en formato HTML a tus clientes desde tu tienda. Boletines avanzados con registro e informe de errores.

Ver Boletín de correo PRO

Conclusiones

Enviar emails a tus clientes desde tu tienda es una idea brillante para evitar tener que contratar servicios de terceros para el envío masivo de emails pero es importante que sepas que estos módulos son una buena opción para mandar correo masivo cuando tienes pocos clientes.

En el momento que tengas más de 1.000 clientes a los que enviar masivamente, es posible que tu servidor no te lo permita. Debes consultar con tu servicio de alojamiento para averiguar cual es el límite de envío masivo de emails.

En cambio, si lo vas a usar para enviar mensajes a un cliente o empleado en concreto, no deberías tener inconvenientes, siempre y cuando, la configuración de envío de emails esté correctamente configurada tanto en tu tienda como en tu servicio de alojamiento.

Autor
Escrito por Jose Aguilar - Director ejecutivo y tecnológico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.
Te ha servido? Valora esta entrada!
(2 votos, promedio: 5 de 5)
Comparte en las redes sociales
¿Buscas trabajo de programador?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Ver más sobre