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 PS | Cambio |
|---|---|
| 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.