Pasar al contenido principal
Enviar mail con archivos adjuntos desde Drupal

Enviar mail con archivos adjuntos desde Drupal

Enviar mail con archivos adjuntos desde Drupal

3 minutos

El envío de correos electrónicos en Drupal requiere de dos partes: Implementación del hook_mail y de la función que llama al servicio de envío de correos.

  1. El hook_mail modifica el mensaje de correo electrónico justo antes de que sea completamente procesado por la clase PhpMail, que es el backend de correo Drupal predeterminado.
  2. El Mail Manager es el servicio de correo al que se puede llamar desde otros enlaces y funciones, según la lógica de nuestro código

Implementación del hook_mail

Para poder enviar correos electrónicos con archivos adjuntos (y si ellos) desde nuestro módulo personalizado, deberemos realizar la implementación de este hook.

El código fuente básico para el mismo (omitiendo los archivos adjuntos) sería el siguiente:

<?php

/**
 * @file
 * Archivo .module.
 */

use Drupal\Core\Render\Markup;

/**
 * Implements hook_mail().
 */
function <module_name>_mail($key, &$message, $params) {
  /* Cabeceras */
  $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed; delsp=yes';
  $message['from'] = \Drupal::config('system.site')->get('name') . '<' . \Drupal::config('system.site')->get('mail') . '>';

  /* Datos comunes a todos los envíos */
  $message['reply-to'] = $message['from'];
  $message['subject'] = $params['subject'];
  $message['body'][] = Markup::create($params['message']);
}

Deberemos sustituír la cadena <module_name> por el nombre de nuestro módulo personalizado.

Ahora bien, como lo que queremos es enviar archivos adjuntos deberemos tener un hook_mail como el mostrado a continuación:

<?php

/**
 * @file
 * Archivo .module.
 */

use Drupal\Core\Render\Markup;

/**
 * Implements hook_mail().
 */
function <module_name>_mail($key, &$message, $params) {
  /* Cabeceras */
  $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed; delsp=yes';
  $message['from'] = \Drupal::config('system.site')->get('name') . '<' . \Drupal::config('system.site')->get('mail') . '>';

  /* Datos comunes a todos los envíos */
  $message['reply-to'] = $message['from'];
  $message['subject'] = $params['subject'];
  $message['body'][] = Markup::create($params['message']);

  /* Compruebo si el mensaje tiene adjuntos */
  if (isset($params['attachments'])) {
    foreach ($params['attachments'] as $attachment) {
      $message['params']['attachments'][] = [
        'filepath' => $attachment['filepath'],
        'filename' => $attachment['filename'],
        'filemime' => $attachment['filemime'],
      ];
    }
  }
}

Llamando al Mail Manager

Con el hook_mail tenemos el 50% del trabajo realizado, ahora nos faltaría la llamada al Mail Manager de Drupal para "lanzar" el envío del correo.

Por ejemplo, podemos encapsular la llamada en una función como ésta:

<?php
/**
 * Función sendMail().
 *
 * Llama al Mail Manager para realizar el envio de un mail.
 */
function sendMail() {
  /* Idioma por defecto */
  $defaultLangCode = \Drupal::languageManager()->getCurrentLanguage()->getId();

  /* Parámetros de configuración */
  $mailManager = \Drupal::service('plugin.manager.mail');
  $module = '<module_name>';
  $send = TRUE;
  $key = 'identificador_para_este_correo';

  /* Datos del correo */
  $params['subject'] = 'Asunto';
  $params['message'] = '<strong>Mensaje</strong> en formato HTML';

  /* Archivos adjuntos */
  $attachment = [];

  $uri = 'public://file_1.pdf';
  $attachment[] = [
    'filepath' => $uri,
    'filename' => basename($uri),
    'filemime' => finfo_file(finfo_open(FILEINFO_MIME_TYPE), $uri),
  ];

  $uri = 'public://file_2.pdf';
  $attachment[] = [
    'filepath' => $uri,
    'filename' => basename($uri),
    'filemime' => finfo_file(finfo_open(FILEINFO_MIME_TYPE), $uri),
  ];

  /* Realizo el envío del mail */
  $resultadoEnvio = $mailManager->mail(
    $module,
    $key,
    'destinatario@ejemplo.com',
    $defaultLangCode,
    $params,
    NULL,
    $send
  );
}

Del código anterior podemos destacar la siguiente porción:

$key = 'identificador_para_este_correo';

Esta clave nos permite diferenciar los diferentes envíos que realizamos y actuar de manera diferente en el hook_mail según su valor.

Artículos relacionados

Comentarios

Añadir nuevo comentario

Este campo no se mostrará públicamente.