En muchas ocasiones manejamos apliciones drupal donde creamos rules para el envío de correos. Si estamos hablando de una aplicación administrativa donde tenemos diferentes roles de usuarios puede darse el caso de que no interesa que los usuarios que reciben los correos vean los emails del resto de usuarios. Para esto tenemos la copia al carbón oculta en los correos electrónicos (bcc) pero hay que retocarlo un poco para que funcione correctamente.
Nos situamos en el código de la acción personalizada de nuestra rule (en nombremodulo.rules.inc). Si no la tenemos tendríamos que crearla con una cabecera tal que así (puedes llamarla como quieras, es orientativo):
function nombremodulo_rules_action_mail_nombrerule($eid, $subject, $message, $from = NULL, $langcode, $settings, RulesState $state, RulesPlugin $element)
Esta función es el callback de la acción personalizada que definimos en el nombremodulo_rules.inc y donde definimos los argumentos de la función que hemos visto anteriormente. Esto corresponde a otro tema que es la creación de rules personalizadas, damos por hecho que sabemos hacerlo.
Vamos a implementar el hook_mail al que llegará cuando hagamos la llamada a drupal_mail en nuestra función previa. Antes de ver este hook, en la función definiremos variables:
- $key: para almacenar una key que identifique nuestro mail. Para el ejemplo utilizaremos 'mikey'
- $email_to: la lista de mails "públicos" que irán en el "para" del correo (puede ser una sola dirección).
- $language: idioma en caso de tener multi-idioma (podemos poner LANGUAGE_NONE si no es así). Podemos recibirlo de los parámetros de la rule personalizada que se presenta al usuario a la hora de configurarla.
- $from: email para el campo "para". Podemos tomarlo también de los parámetros de la rule personalizada si así lo deseamos, o hardcodearlo.
- $params: array de parámetros adicionales. En él metermos:
- subject: Asunto del mail
- message: Cuerpo del mail
- langcode: De nuevo el idioma
- headers: Es un array con los campos extra de cabecera que necesitamos. Aquí pondremos nuestro Bcc, o incluso el Bc (copia carbón). Por cada elemento del array (Bcc y/o Bc) metermos una cadena de texto que contiene la lista de direcciones de correos separadas por comas.
Así nos quedaría nuestra variable $params:
$params = array(
'subject' => "Reunión día 15",
'message' => "Reunión el día 15 en la sala de juntas.",
'langcode' => $langcode,
'headers' => array(
'Bc' => "email1@solucionex.com, email2@solucionex.com",
'Bcc' => "email3@solucionex.com, email4@solucionex.com"
)
);
Ya tenemos lo necesario, tan sólo llamaremos a drupal_mail con los parámetros definidos:
drupal_mail('nombremodulo', $key, $email_to, $language, $params, $from);
Ahora nos vamos al código de nuestro módulo personalizado: nombremodulo.module e implementamos el hook_mail. Lo que vamos a hacer aquí es simplemente llevar las cabeceras, asunto y cuerpo de nuestro $params, a su respectivo sitio dentro del mensaje del hook:
function nombremodulo_mail($key, &$message, $params) {
switch ($key) {
case 'mikey':
$message['headers'] += $params['headers'];
$message['subject'] = $params['subject'];
$message['body'] = array(0=>t($params['message']));
}
}
Con esto nos enviará el mail a una dirección pública, hará copias carbón (cc) a una lista de mails deseado, y copias carbón ocultas a otro listado, tal y como queríamos.