Enviar correos electrónicos con template personalizado en Magento 2

Enviar correos electrónicos con template personalizado en Magento 2

Para poder enviar un correo electrónico a traves de Magento 2, necesitaremos hacerlo a través de un template, que podremos crearlo a través del panel de Magento, o por el contrario, desde nuestro propio módulo.

En el tutorial vamos a intentar dejar claro como hacerlo de las dos formas.

Para este tutorial voy a crear un módulo que será JLNarvaez_SendMail, y además crearé un controlador, que lo único que haga sea enviar el correo electrónico para poder probarlo.

En primer lugar vamos a explicar como crear un nuevo template desde el panel de administrador. Para ello nos tendremos que ir a Marketing > (Communications) Email templates.

Una vez allí, nos aparecerá un grid con los templates que tengamos creados, y pulsamos en Add New Template para añadir un nuevo template, que nos redirigirá al formulario de creación:

Pantalla crear template

Tendremos los siguientes campos:

  • Template Name: Aquí pondremos un nombre identificativo del template.
  • Template Subject: El sujeto que tendrá nuestro correo al enviarse.
  • Template Content: El contenido que tendrá nuestro correo.
  • Template Styles: Los estilos que tendrá nuestro correo.

Podremos usar variables tanto en el Content, como en el Subject, que posteriormente pasaremos al template a la hora de enviar el correo, si queremos que el correo tenga contenido personalizado. También podemos usar variables que ya vienen predefinidas en Magento, y añadirlas pulsando el botón Insert Variable....

Una vez tenemos esto, podremos guardar el template, y lo importante es quedarnos con el valor del ID que tiene nuestro template.

Por otra parte, si queremos crearlo a través de código en nuestro módulo, deberemos crear los siguientes archivos:

app/code/JLNarvaez/SendMail/etc/email_templates.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Email/etc/email_templates.xsd">
    <template id="email_custom_template_jlnarvaez" label="Email custom JLNarvaez" file="customtemplate.html" type="html" module="JLNarvaez_SendMail" area="adminhtml"/>
</config>

Con este archivo indicaremos los diferentes templates de correo electrónico, que tengamos definidos en nuestro módulo. En este caso, a diferencia de la otra forma de crear los templates, nos tendremos que quedar con el nombre (que deberá ser único) que pondremos en el atributo id. Otro atributo importante es el file en el que indicaremos el nombre del archivo que tendrá nuestro template.

Para crear el template, añadiremos el siguiente archivo:

app/code/JLNarvaez/SendMail/view/frontend/email/customtemplate.html
<!--@subject {{trans "Test email"}}  @-->
<!--@vars {
"var x":"Coordenada X",
"var y":"Coordenada Y"
} @-->

Este es un email de prueba <br/>
Este es el valor de x:  {{var x}} <br/>
Este es el valor de y: {{var y}} <br/>

La manera de indicar el Sujeto del correo de esta manera es, indicando entre comentarios de HTML el @subject, tal y como vemos arriba. El hecho de poner el @vars es optativo, pero es recomendable, ya que nos servirá para documentar para qué sirve cada variable que debe llegarle al template.

Por último, en nuestro código, deberemos inyectar a través del constructor de nuestra clase lo siguiente:

public function __construct(
    Magento\Framework\Mail\Template\TransportBuilder $transportBuilder
) {
    $this->transportBuilder = $transportBuilder;
}

Para enviar el correo nos bastará con las siguientes sentencias:

$transport = $this->transportBuilder
    ->setTemplateIdentifier('email_custom_template_jlnarvaez') // Cambiar por ID si es creado desde el panel
    ->setTemplateOptions(
        [
            'area' => Area::AREA_ADMINHTML,
            'store' => Store::DEFAULT_STORE_ID,
        ]
    )
    ->setTemplateVars([
        'x' => 220,
        'y' => 251
    ])
    ->addTo('jlnarvaez@jlnarvaez.com')
    ->setFrom('general') // Valor "trans_email/ident_general/email" de la tabla "core_config_data"
    ->getTransport();

$transport->sendMessage();

Ahora explicaré brevemente para qué usaremos las distintas llamadas a las funciones del TransportBuilder:

  • setTemplateIdentifier(): le pasaremos por parámetro el atributo id indicado en el XML email_templates.xml. Sin embargo, si hemos creado el template a través del panel, le pasaremos el número indicado en la columnaID del grid de templates que visitamos anteriormente.
  • setTemplateOptions(): especificaremos a través de un array, el area y la store desde donde vamos a enviar el correo.
  • setTemplateVars(): le pasaremos por parámetro un array con las variables que vayamos a usar. ('variable' => 'valor').
  • addTo(): podremos pasarle una cadena con la dirección de correo al que le vamos a enviar el mail, o incluso podremos pasarle un array con multiples direcciones.
  • setFrom(): aquí tenemos un par de opciones. Una de ellas es indicar el nombre identificativo de los emails de la tienda configurados en Magento. Estos correos los podemos ver en System > Configuration > General > Store Email Addresses y por defecto tendremos los siguientes correos: general, sales, support, custom1 y custom2. La otra opción es indicar la dirección de correo electrónico directamente.

Finalmente llamaremos a la función sendMessage() para proceder al envío del correo electrónico.

Para poder enviar correos electrónicos en nuestro entorno local, sin necesidad de configurar nada en nuestra máquina, podremos usar algún módulo como por ejemplo Magepal SMTP desde el cuál podremos usar nuestra cuenta de Gmail.

También os dejo un repositorio con el código del tutorial en mi GitHub al que puedes acceder desde aquí.

Jose Luis
Jose Luis
Magento 2 Certified Developer