hook_mail()
должен использоваться из модуля для изменения его собственного почтового сообщения, тогда как hook_mail_alter()
должен использоваться из модуля для изменения сообщения, отправленного другими модулями.
Это ясно из следующегокод, взятый из drupal_mail()
:
// Build the e-mail (get subject and body, allow additional headers) by
// invoking hook_mail() on this module. We cannot use module_invoke() as
// we need to have $message by reference in hook_mail().
if (function_exists($function = $module .'_mail')) {
$function($key, $message, $params);
}
// Invoke hook_mail_alter() to allow all modules to alter the resulting e-mail.
drupal_alter('mail', $message);
$module
- это первый параметр, переданный drupal_mail()
.
Ясно, что функция не вызывает реализацию hook_mail()
каждого модуля, реализующегоэто, но это вызывает ловушку только для модуля, вызывающего функцию.
Существуют и другие различия, например, когда вызываются две ловушки (hook_mail_alter()
не может установить язык для сообщения, заданного до вызова hook_mail_alter()
), и параметры, которые они получают (hook_mail($key, &$message, $params)
против hook_mail_alter(&$message)
).