Как использовать drupal_mail () для отправки писем с помощью настраиваемого шаблона

Я хотел бы использовать функцию drupal_mail () для отправки сообщений электронной почты, но с помощью настраиваемого HTML-шаблона, чтобы они соответствовали моему дизайну веб-сайта, но я полный новичок для перехвата и модулей и т. д., поэтому я буду благодарен за какое-то объяснение или руководство для новичков.

Я могу создать шаблон сам, мне просто нужно знать, как получить drupal_mail (), чтобы использовать его.

32 голоса | спросил Andy 6 Jpm1000000pmSun, 06 Jan 2013 16:11:32 +040013 2013, 16:11:32

4 ответа


39

Если вы пытаетесь отправить почту через свой настраиваемый модуль, вы можете следовать приведенному ниже руководству. Скажем, у меня был один модуль под названием «Коммерческий холст (commerce_canvas)»  1. Сначала измените почтовую функцию Drupal для поддержки ссылок и добавьте другие типы кодирования.


/**
 * Реализует hook_mail_alter ()
 * @param string $ message
 * /
function commerce_canvas_mail_alter (& $ message) {
    $ headers = array (
        'MIME-Version' => «1,0»,
        'Content-Type' => «Текст /html; кодировка = изо-8859-1; Формат = тек»,
        «Content-Transfer-Encoding» => '8Bit',
        «X-Mailer» => 'Drupal',
    );
    foreach ($ headers as $ key => $ value) {
        $ message ['headers'] [$ key] = $ value;
    }
}
  1. Затем, закрепите HOOK_mail в своем модуле как

/**
 * Реализует hook_mail ()
 * @param string $ key
 * @param string $ message
 * @param unknown_type $ params
 * /
function commerce_canvas_mail ($ key, & $ message, $ params) {

    //Выбор языка
    $ options = array (
        'langcode' => $ Сообщение [ 'язык'] - > язык,
    );
    switch ($ key) {
        case "user_payment_notification":
            $ message ['subject'] = isset ($ params ['subject'])? $ params ['subject']: $ message ['subject'] = t ('Payment received @ site-name', array ('@ site-name' => variable_get ('site_name', 'Express Canvas')) , $ options);
            $ message ['body'] [] = isset ($ params ['body'])? $ params ['body']: NULL;
            if (isset ($ params ['headers']) & & is_array ($ params ['headers'])) {
                $ message ['headers'] + = $ params ['headers'];
            }
            ломать;
    }
}


  1. Затем вам нужно создать функцию-обертку для вызова почты из вашего модуля.

function commerce_canvas_mail_send (массив $ values ​​= array ()) {
    $ module = $ values ​​['module'];
    $ key = $ values ​​['key'];
    $ to = $ values ​​['to'];
    $ from = $ values ​​['form'];
    $ language = isset ($ values ​​['lang'])? $ values ​​['lang']: language_default ();
    $ params = array (
        'subject' => $ значения [ 'предмет'],
        'body' => $ значения [ 'тело'],
    );
    if (array_key_exists ('headers', $ values)) {
        $ params ['headers'] = $ values ​​['headers']; //Предполагается как массив
    }
    $ send = TRUE;
    $ mail = drupal_mail ($ module, $ key, $ to, $ language, $ params, $ from, $ send);
    if ($ mail ['result']) {
        return TRUE;
    } else {
        $ error_msg = 'Не удалось отправить электронное письмо в commerce_canvas Module';
        watchdog ('canvas-email', $ error_msg, array (), WATCHDOG_ALERT);
        return FALSE;
    }
}

Эта функция отправит электронное письмо, а также создаст отладочные сообщения, если что-то произойдет неправильно. Но вы все равно не сможете отправить HTML-почту, потому что вам нужно расширить свой собственный Drupal 7 по умолчанию DefaultMailSystem . Поэтому нужно сделать следующее:


class CommerceCanvasMailSystem расширяет DefaultMailSystem {
    /**
     * Конкатенация и обертка тела электронной почты для текстовых сообщений.
     *
     * @param $ message
     * Массив сообщений, как описано в hook_mail_alter ().
     *
     * @вернуть
     * Отформатированное сообщение $.
     * /
    формат публичных функций (массив $ message) {
        $ message ['body'] = implode ("\ n \ n", $ message ['body']);
        return $ message;
    }

    /**
     * Отправить сообщение электронной почты, используя переменные Drupal и настройки по умолчанию.
     *
     * @see http://php.net/manual/en/function.mail.php
        * @see drupal_mail ()
     *
     * @param $ message
     * Массив сообщений, как описано в hook_mail_alter ().
     * @вернуть
     * TRUE, если почта была успешно принята, иначе FALSE.
     * /
    публичная функция mail (массив $ message) {
        $ mimeheaders = array ();
        foreach ($ message ['headers'] как $ name => $ value) {
            $ mimeheaders [] = $ name. ':'. mime_header_encode ($ значение);
        }
        $ line_endings = variable_get ('mail_line_endings', MAIL_LINE_ENDINGS);
        обратная почта (
        $ Сообщение [ 'к'],
        mime_header_encode ($ сообщение [ 'предмет']),
        //Примечание: электронная почта использует CRLF для строк. API PHP требует LF
        //в Unix и CRLF в Windows. Drupal автоматически угадывает
        //формат окончания строки, подходящий для вашей системы. Если вам нужно
        //переопределите это, отредактируйте $ conf ['mail_line_endings'] в settings.php.
        preg_replace ('@ \ r? \ n @', $ line_endings, $ message ['body']),
        //Для заголовков API PHP предполагает, что мы обычно используем CRLF,
        //но некоторые MTA неправильно заменяют LF CRLF. См. # 234403.
        join ("\ n", $ mimeheaders)
        );
    }
}


Затем вам нужно зарегистрировать новую функцию темы, которая вызовет ваш пользовательский файл шаблона в вашем hook_theme ().


/**
 * Реализует hook_theme ();
 * /
function commerce_canvas_theme ($ existing, $ type, $ theme, $ path) {
  if ($ type == 'module') {
    return array (
      'tracking_code_email' => массив ('variables' => массив (
          'image_path' => НОЛЬ,
          'user' => НОЛЬ,
          'page' => НОЛЬ,
        ),
        'template' => «Коммерция-холст-кода отслеживания»,
        'path' => drupal_get_path ('module', 'commerce_canvas'). '/theme',
      ),

    );
  }
}

Наконец, вам нужно позвонить этой функции темы во время отправки электронной почты как,



функция a_custom_function ($ params) {

$ email_text_user = тема ('tracking_code_email', массив (
                    'image_path' => $ base_url. '/'. drupal_get_path ('module', 'commerce_canvas'). '/изображений',
                    'user' => ноль,
                    'page' => массив (
                        'greet_text' => t («Спасибо за ваш заказ на Express Canvas, ваш заказ готов и отправлен». Вы можете отслеживать свой заказ, используя отслеживание FedEx с вашим номером отслеживания:  '. $ order-> field_tracking_number [' und '] [ '0'] [ 'значение']. ''),

                    ),
                ));
$ sent_to_user = commerce_canvas_mail_send ($ email_values_user);

}

Это полный фрагмент, который правильно обрабатывает HTML-адрес в Drupal 7, поэтому в hook_theme вы можете указать свой собственный шаблон.

ответил Aneek Mukhopadhyay 8 Jpm1000000pmTue, 08 Jan 2013 17:56:04 +040013 2013, 17:56:04
12

Если вы хотите тему исходящих писем с помощью настраиваемых шаблонов, вы должны использовать HTML Mail .

  

Позволяет тематически отправлять ваши сообщения так же, как и тема вашего сайта.

Он хорошо работает с другими модулями, такими как Печать , Mail mime и т. д.

Чтобы использовать HTML-почту, вы должны установить модуль Mail System .

ответил AjitS 7 Jam1000000amMon, 07 Jan 2013 11:49:59 +040013 2013, 11:49:59
4

Пример использования:

$ module = 'module_name';
    $ key = 'key';
    $ language = language_default ();
    $ params = array ();
    $ from = NULL;
    $ send = FALSE;
    $ message = drupal_mail ($ module, $ key, $ email, $ language, $ params, $ from, $ send);

    $ message ['subject'] = $ subject;
    $ message ['body'] = array ();
    $ message ['body'] [] = $ line1;
    $ message ['body'] [] = $ line2;

    //Получить ответственную реализацию для этого сообщения.
    $ system = drupal_mail_system ($ module, $ key);

    //Отформатируем тело сообщения.
    $ message = $ system-> format ($ message);

    //Отправить электронное письмо.
    $ message ['result'] = $ system-> mail ($ message);
ответил monymirza 7 Jam1000000amMon, 07 Jan 2013 11:32:52 +040013 2013, 11:32:52
3

Чтобы отправить HTML-сообщение электронной почты, вы можете использовать Mimemail . После того, как он настроен и настроен, вы можете просто подготовить шаблон, назовите его mimemail-message.tpl.php, поместите его в свой каталог тем, и он будет автоматически применяться ко всей исходящей электронной почте (при условии, что вы настроили всю почту, отправленную с помощью Mimemail).

Настройка модуля, вероятно, проще, чем переопределение drupal_mail ().

ответил Patrick Kenny 6 Jpm1000000pmSun, 06 Jan 2013 18:45:25 +040013 2013, 18:45:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132