Для того, чтобы программно отправить сообщение из Drupal, нужно использовать 2 функции, одна из которых - hook_mail().
Итак, простое тестовое сообщение.

<?php
function example_callback() {
  $to     = 'mail@example.com';
  $key    = 'example_email';
  $params = array(
    'body' => t('Test message')
  );
  drupal_mail('example', $key, $to, language_default(), $params);
}

/**
 * Implements hook_mail().
 */
function example_mail($key, &$message, $params) {
  switch ($key) {
    // Ключ, добавленный при использовании функции drupal_mail()
    case 'example_email':
      $message['subject'] = t('Example Email');
      $message['body'][] = $params['body'];
      break;
  }
}

Есть один нюанс: по умолчанию, до 8-ой версии Drupal все сообщения отправляются как текст. Это значит, если в $params['body'] вставить какой-либо HTML, то получатель увидит его простым текстом.
Для того, чтобы отправлять сообщения в формате HTML необходимо переопределить класс DefaultMailSystem и реализовать хук hook_mail_alter.

<?php
/**
 * Overridden Drupal mail backend using PHP's mail function.
 */
class ExamlpeMailSystem extends DefaultMailSystem {

  /**
   * Concatenate and wrap the e-mail body for HTML-text mails.
   *
   * @param array $message
   *   A message array, as described in hook_mail_alter().
   *
   * @return array
   *   The formatted $message.
   */
  public function format(array $message) {
    if (is_array($message['body'])) {
      // Склеиваем элементы массива в строку.
      $message['body'] = implode("\n\n", $message['body']);
    }
    $message['body'] = drupal_wrap_mail($message['body']);
    return $message;
  }
}

/**
 * Implements hook_mail_alter().
 */
function example_mail_alter(&$message) {
  $headers = array(
    'MIME-Version'              => '1.0',
    // Меняем формат сообщения на HTML
    'Content-Type'              => 'text/html; charset=iso-8859-1; format=flowed',
    'Content-Transfer-Encoding' => '8Bit',
    'X-Mailer'                  => 'Drupal',
  );
  foreach ($headers as $key => $value) {
    $message['headers'][$key] = $value;
  }
}

Это все! Теперь можно отсылать сообщения как обычно, но вместо простого текста использовать HTML.

Другие посты