Enviar mail con archivos adjuntos desde Drupal
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.
- 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.
- 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.
INFO: El contenido del artículo se adhiere a nuestros principios de ética editorial. Para notificar un error visita nuestro formulario de contacto.