drupal_mail
includes/mail.inc, строка 82
- Версии
- 5
drupal_mail(
$mailkey, $to,$subject,$body, $from = NULL,$headers= array())- 6
drupal_mail($module, $key, $to, $language, $params = array(), $from = NULL, $send = TRUE)
Создаёт письмо (email) и опционально его отправляет.
Отправка e-mail по определенному шаблону (тема, текст и, возможно, заголовки e-mail) и замена значений для использования в соответствующих местах в шаблоне.
Processed e-mail templates are
requested from hook_mail()
from the module sending the e-mail. Any module
can modify the composed e-mail message array using hook_mail_alter()
.
Finally drupal_mail_send()
sends the e-mail, which can be reused
if the exact same composed e-mail is to be sent to multiple recipients.
Finding out what language to send the e-mail with needs some consideration.
If you send e-mail to a user, her preferred language should be fine, so
use user_preferred_language()
. If you send email based on form values
filled on the page, there are two additional choices if you are not
sending the e-mail to a user on the site. You can either use the language
used to generate the page ($language
global variable) or the site default
language. See language_default()
. The former is good if sending e-mail to
the person filling the form, the later is good if you send e-mail to an
address previously set up (like contact addresses in a contact form).
Taking care of always using the proper language is even more important
when sending e-mails in a row to multiple users. Hook_mail()
abstracts
whether the mail text comes from an administrator setting or is
static in the source code. It should also deal with common mail tokens,
only receiving $params
which are unique to the actual e-mail at hand.
Пример:
function example_notify($accounts) { foreach ($accounts as $account) { $params['account'] = $account; // example_mail() will be called based on the first drupal_mail() parameter. drupal_mail('example', 'notice', $account->mail, user_preferred_language($account), $params); } } function example_mail($key, &$message, $params) { $language = $message['language']; $variables = user_mail_tokens($params['account'], $language); switch($key) { case 'notice': $message['subject'] = t('Notification from !site', $variables, $language->language); $message['body'] = t("Dear !username\n\nThere is new content available on the site.", $variables, $language->language); break; } }
Параметры
$module
Имя модуля, у которого будет вызван hook_mail(). Чтобы завершить заполнение структуры $message
, которая будет уже содержать общие значения, будет вызван хук {$module
}_mail()
.
$key
Ключ для идентификации отправляемого сообщения. Окончательный идентификатор письма, используемый для модификации, будет выглядеть как {$module
}_{$key
}.
$to
E-mail, на который будет отправлено сообщение. Формат этой строки должен соответствовать RFC 2822.
Некоторые примеры:
- user@example.com
- user@example.com, anotheruser@example.com
- User <user@example.com>
- User <user@example.com>, Another User <anotheruser@example.com>
$language
Language object to use to compose the e-mail.
$params
Optional parameters to build the e-mail.
$from
Sets From to this value, if given.
$send
Send the message directly, without calling drupal_mail_send() manually.
Возвращаемое значение
The $message
array structure containing all details of the
message. If already sent ($send
= TRUE
), then the 'result'
element
will contain the success indicator of the e-mail, failure being already
written to the watchdog. (Success means nothing more than the message being
accepted at php-level, which still doesn't guarantee it to be delivered.)
Код
<?php
function drupal_mail($module, $key, $to, $language, $params = array(), $from = NULL, $send = TRUE) {
$default_from = variable_get('site_mail', ini_get('sendmail_from'));
// Bundle up the variables into a structured array for altering.
$message = array(
'id' => $module .'_'. $key,
'to' => $to,
'from' => isset($from) ? $from : $default_from,
'language' => $language,
'params' => $params,
'subject' => '',
'body' => array()
);
// Build the default headers
$headers = array(
'MIME-Version' => '1.0',
'Content-Type' => 'text/plain; charset=UTF-8; format=flowed; delsp=yes',
'Content-Transfer-Encoding' => '8Bit',
'X-Mailer' => 'Drupal'
);
if ($default_from) {
// To prevent e-mail from looking like spam, the addresses in the Sender and
// Return-Path headers should have a domain authorized to use the originating
// SMTP server. Errors-To is redundant, but shouldn't hurt.
$headers['From'] = $headers['Sender'] = $headers['Return-Path'] = $headers['Errors-To'] = $default_from;
}
if ($from) {
$headers['From'] = $from;
}
$message['headers'] = $headers;
// 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);
// Concatenate and wrap the e-mail body.
$message['body'] = is_array($message['body']) ? drupal_wrap_mail(implode("\n\n", $message['body'])) : drupal_wrap_mail($message['body']);
// Optionally send e-mail.
if ($send) {
$message['result'] = drupal_mail_send($message);
// Log errors
if (!$message['result']) {
watchdog('mail', 'Error sending e-mail (from %from to %to).', array('%from' => $message['from'], '%to' => $message['to']), WATCHDOG_ERROR);
drupal_set_message(t('Unable to send e-mail. Please contact the site administrator if the problem persists.'), 'error');
}
}
return $message;
}
?>
Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии