Home / Alter Drupal Email Messages

Alter Drupal Email Messages

I just had a requirement to add some text to the body of Drupal's outgoing emails. Turns out it's not too tough using hook_mail_alter(). I started out by using var_export() and drupal_set_message() to find out more information about the array that Drupal creates for the message:

<?php
/**
* Implementation of hook_mail_alter().
*/
function your_module_mail_alter(&$message) {
 
// For example, submit the contact form and you
  // will be able to see the $message array

 
$v = var_export($message, true);
 
drupal_set_message("message: " . $v);
}
?>

The email text is constructed from an array of elements, so adding a new element to the email body is just a matter of adding an element to the body array:

<?php
/**
* Implementation of hook_mail_alter().
*/
function your_module_mail_alter(&$message) {
 
// Add a link to the user's profile in the message body
  // when you submit the site wide contact form:

 
switch ($message['id']) {
    case
'contact_page_mail':
      global
$user;
      if (
$user->uid != 0) {
       
$message['body'][] = 'Profile: [your-site-address]/user/' . $user->uid;
      }
    break;
  }

}
?>

You could just as easily use this for a variety of other cases. For example, you could add conditional recipients, do custom logging, or even use the message content as a conditional trigger. Lots of good stuff there.