---
title: Hooks de email — modificar y controlar el envio
section: email
slug: hooks-email
description: "Hooks de email en PrestaShop: actionEmailSendBefore para interceptar envios, getExtraMailTemplateVars para variables extra, actionGetExtraMailTemplateVars."
keywords: prestashop hook email actionEmailSendBefore getExtraMailTemplateVars interceptar correo modulo PS8
last_updated: 2024-12-01
source_url: "https://ayudaprestashop.es/email/hooks-email"
---

# Hooks de email — modificar y controlar el envio

> Hooks de email en PrestaShop: actionEmailSendBefore para interceptar envios, getExtraMailTemplateVars para variables extra, actionGetExtraMailTemplateVars.

PrestaShop proporciona varios hooks para interceptar, modificar y enriquecer el sistema de envio de emails. Permiten cancelar envios, cambiar destinatarios, agregar variables a las plantillas y registrar temas de email personalizados.

## Hooks de email disponibles

| Hook | Cuando se llama | Puede cancelar |
| --- | --- | --- |
| actionEmailSendBefore | Antes de enviar cualquier email | Si (return false) |
| actionGetExtraMailTemplateVars | Al preparar las variables del template | No |
| actionListMailThemes | Al listar temas de email disponibles | No |
| actionBuildMailLayoutVariables | Al construir el layout del email | No |
| actionGetMailLayoutTransformations | Al transformar el HTML del email | No |
| actionEmailSendAfter | Despues de enviar el email | No |

## actionEmailSendBefore — interceptar el envio

*Interceptar y modificar emails antes de enviarlos*

```php
<?php

public function install(): bool
{
    return parent::install()
        && $this->registerHook('actionEmailSendBefore');
}

/**
 * Llamado antes de cada envio de email.
 * Si el hook devuelve false, el email NO se envia.
 *
 * @param array $params {
 *   @var string   $idLang
 *   @var string   $template    Nombre del template (sin extension)
 *   @var string   $subject
 *   @var array    $templateVars
 *   @var string   $to          Email del destinatario
 *   @var string   $toName      Nombre del destinatario
 *   @var string   $from        Email del remitente
 *   @var string   $fromName
 *   @var string   $replyTo
 *   @var bool     $die
 *   @var string   $templatePath
 *   @var array    $fileAttachment
 *   @var bool     $mode_smtp
 *   @var string   $templateHtml
 *   @var string   $templateTxt
 *   @var int      $idShop
 * }
 */
public function hookActionEmailSendBefore(array &$params): bool
{
    // ── Ejemplo 1: Redirigir todos los emails en staging ──
    if (!_PS_MODE_DEV_ && defined('STAGING_ENV') && STAGING_ENV) {
        $params['to']     = 'dev@miempresa.com';
        $params['toName'] = 'DEV Team';
    }

    // ── Ejemplo 2: Cancelar emails de prueba (template 'test') ──
    if ($params['template'] === 'test' && !_PS_MODE_DEV_) {
        return false; // Cancelar el envio
    }

    // ── Ejemplo 3: Log de todos los emails enviados ──
    PrestaShopLogger::addLog(
        sprintf('Email enviado: template=%s, to=%s', $params['template'], $params['to']),
        1, null, 'EmailLogger'
    );

    // ── Ejemplo 4: Anadir CC a emails de pedido ──
    if ($params['template'] === 'order_conf') {
        // No hay soporte nativo de CC en Mail::Send, pero podemos cambiar el template
        $params['templateVars']['{cc_notice}'] = 'Copia enviada a: admin@tienda.com';
    }

    return true; // true = continuar con el envio
}
```

## actionGetExtraMailTemplateVars — variables custom

*Anadir variables custom a los templates de email*

```php
<?php

public function install(): bool
{
    return parent::install()
        && $this->registerHook('actionGetExtraMailTemplateVars');
}

/**
 * Agrega variables extra a los templates de email.
 * Las variables se referencian en el template como {var_name}.
 */
public function hookActionGetExtraMailTemplateVars(array &$params): void
{
    $template = $params['template'] ?? '';

    // ── Agregar a todos los emails ──
    $params['extra_template_vars'] = array_merge(
        $params['extra_template_vars'] ?? [],
        [
            '{shop_phone}'   => Configuration::get('PS_SHOP_PHONE'),
            '{shop_address}' => Configuration::get('PS_SHOP_ADDR1'),
            '{current_year}' => date('Y'),
        ]
    );

    // ── Agregar solo al email de confirmacion de pedido ──
    if ($template === 'order_conf') {
        $idOrder = (int) ($params['template_vars']['{id_order}'] ?? 0);
        if ($idOrder) {
            $loyaltyPoints = $this->calculateLoyaltyPoints($idOrder);
            $params['extra_template_vars']['{loyalty_points}'] = $loyaltyPoints;
        }
    }
}
```

## actionListMailThemes — registrar temas de email

*Registrar un tema de email personalizado*

```php
<?php

public function install(): bool
{
    return parent::install()
        && $this->registerHook('actionListMailThemes');
}

/**
 * Registra un tema de email personalizado en el sistema de temas de PS.
 * Los temas aparecen en el BO en Diseno → Temas de email.
 */
public function hookActionListMailThemes(array &$params): void
{
    $params['themes'][] = new \PrestaShop\PrestaShop\Core\MailTemplate\Theme\Theme(
        'mytheme',         // Nombre del tema (carpeta)
        'Mi Tema de Email', // Nombre visible en el BO
        _PS_MODULE_DIR_ . $this->name . '/mails/themes/mytheme/' // Ruta
    );
}
```

## Bloquear emails en entorno de desarrollo

*Interceptar todos los emails en desarrollo para no enviarlos*

```php
<?php

// ── Modulo de desarrollo: interceptar todos los emails ──
public function hookActionEmailSendBefore(array &$params): bool
{
    if (!_PS_MODE_DEV_) {
        return true; // En produccion, no interferir
    }

    // Guardar el email en un archivo en lugar de enviarlo
    $logDir  = _PS_MODULE_DIR_ . $this->name . '/logs/';
    $logFile = $logDir . 'emails_' . date('Y-m-d') . '.log';

    if (!is_dir($logDir)) {
        mkdir($logDir, 0755, true);
    }

    $logEntry = [
        'time'     => date('Y-m-d H:i:s'),
        'template' => $params['template'],
        'to'       => $params['to'],
        'subject'  => $params['subject'],
        'vars'     => $params['templateVars'] ?? [],
    ];

    file_put_contents(
        $logFile,
        json_encode($logEntry, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . PHP_EOL . '---' . PHP_EOL,
        FILE_APPEND
    );

    // Devolver false para cancelar el envio
    return false;
}
```


---

*Fuente: [https://ayudaprestashop.es/email/hooks-email](https://ayudaprestashop.es/email/hooks-email). Version Markdown generada automaticamente para consumo por LLMs.*
