ACTION FO+BO Desde 1.5

actionEmailSendBefore

~3 min de lectura

#Descripcion

Se ejecuta justo antes de que un email sea enviado por PrestaShop. Permite modificar el contenido del email, cambiar destinatarios, añadir adjuntos o incluso cancelar el envio completamente. Es extremadamente util para personalizar comunicaciones, implementar sistemas de logging de emails o integrar con servicios de email transaccional externos.

📍
Disparado por
  • Mail::send()classes/Mail.php

#Parametros

Nombre Tipo Requerido Descripcion
$idLang int Si ID del idioma del email
$template string Si Nombre de la plantilla de email (ej: 'order_conf', 'new_order')
$subject string Si Asunto del email
$templateVars array Si Variables de la plantilla (pares clave-valor para sustitucion en el template)
$to string Si Direccion de email del destinatario
$toName string Si Nombre del destinatario
$from string Si Direccion de email del remitente
$fromName string Si Nombre del remitente
$fileAttachment array|null No Archivos adjuntos (array con 'content', 'name', 'mime')
$mode_smtp bool|null No Si se usa SMTP personalizado
$templatePath string Si Ruta a la carpeta de plantillas
$die bool No Si PHP debe terminar despues del envio
$idShop int Si ID de la tienda
Retorno
void Puede establecer $params['send'] = false para cancelar el envio del email

#Ejemplo de codigo

mymodule.php
php
<?php
public function install()
{
    return parent::install()
        && $this->registerHook('actionEmailSendBefore');
}
mymodule.php
php
<?php
/**
 * Hook actionEmailSendBefore — antes de enviar email
 */
public function hookActionEmailSendBefore(array &$params)
{
    $template = $params['template'];
    $to = $params['to'];

    // Ejemplo 1: Registrar todos los emails enviados
    Db::getInstance()->insert('mymodule_email_log', [
        'template'    => pSQL($template),
        'subject'     => pSQL($params['subject']),
        'recipient'   => pSQL($to),
        'id_lang'     => (int) $params['idLang'],
        'id_shop'     => (int) $params['idShop'],
        'date_add'    => date('Y-m-d H:i:s'),
    ]);

    // Ejemplo 2: Añadir variable personalizada a todos los emails
    $params['templateVars']['{mymodule_phone}'] = Configuration::get('MYMODULE_SUPPORT_PHONE');
    $params['templateVars']['{mymodule_whatsapp}'] = Configuration::get('MYMODULE_WHATSAPP');

    // Ejemplo 3: Cancelar emails de confirmacion de pedido para un grupo especifico
    if ($template === 'order_conf') {
        $customer = Customer::getCustomersByEmail($to);
        if (!empty($customer)) {
            $idGroup = (int) $customer[0]['id_default_group'];
            if ($idGroup === (int) Configuration::get('MYMODULE_NO_EMAIL_GROUP')) {
                $params['send'] = false; // Cancelar envio
                return;
            }
        }
    }

    // Ejemplo 4: Añadir copia oculta al admin en emails de pedido
    if (in_array($template, ['order_conf', 'payment', 'shipped'])) {
        $params['bcc'] = Configuration::get('PS_SHOP_EMAIL');
    }
}

#Notas y gotchas

  • ⚠️ El parametro `$params` debe pasarse por REFERENCIA (&$params) para poder modificar valores o cancelar el envio.
  • ⚠️ Establece `$params['send'] = false` para cancelar el envio del email sin generar errores.
  • ⚠️ Los nombres de template comunes son: 'order_conf', 'new_order', 'payment', 'shipped', 'order_return_state', 'contact'.
  • ⚠️ Las variables de plantilla usan formato `{variable}` — asegurate de incluir las llaves.
  • ⚠️ Este hook se ejecuta para TODOS los emails de la tienda, incluyendo los del back office.
  • ⚠️ Cuidado con bucles infinitos: no envies emails dentro de este hook.

#Relacionados

#Historial de versiones

Version PSCambio
1.5 Introducido con los parametros basicos
1.6 Añadida la posibilidad de cancelar con send = false
1.7 Sin cambios. Compatible con PS 1.7, 8.x y 9.x
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.