Как отправить HTML письмо

25

Я создаю простой модуль, который будет отправлять пользователям электронные письма в формате HTML для сделок на нашем веб-сайте.

Я много искал, но не могу найти правильного решения для Drupal. Теперь я могу отправлять письма, но текстовые сообщения.

Что такое пошаговая процедура для отправки электронных писем в формате HTML в Drupal 7?

function example_form_submit( $form,&$form_state) {
    $friend_email=$form_state['values']['friend_email'];
    $mailto =$friend_email;  //gift to a friend
    $mailfrom ='no-reply@example.com';
    $subject = "another message for  HTML email from example.com";
    $body="<h2 style='font-size:28px;color:red;'>Hello EMAIL, i here i want to be <b>bolded</b></h2>";
    if (drupal_mail('example', 'send_gift', $mailto, language_default(),$params,$mailfrom,TRUE)) {
        drupal_set_message(t('Your gift was sent successfully!!!'));
    }
    else {
        drupal_set_message(t('<font color="red">Error occured while sending your mail!!!</font>'));
    }


/****hook_mail*/
function example_mail($key,&$message,$params) {
    $language = $message['language'];
    switch ($key) {
        case 'send_gift':
            $message['subject']=t($params['subject'], $var, $language->language);
            $message['body'][]=$params['body'];
            $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed';
        break;
    }
}
mrcniceguy
источник
Вы не передаете страницу в полном HTML
GoodSp33d

Ответы:

22

Как упоминалось в geoff, одним из вариантов будет использование модуля Mime Mail, но вы также можете разрешить своему пользовательскому модулю отправлять электронные письма в формате HTML с некоторым дополнительным кодом. Короче говоря, вам нужно изменить mail_systemпеременную и написать свою собственную реализацию MailSystemInterface. Примером этого является следующий код.

Внутри mymodule.install:

function mymodule_enable() {
  $current = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  $addition = array('mymodule' => 'MymoduleMailSystem');
  variable_set('mail_system', array_merge($current, $addition));
}

function mymodule_disable() {
  $mail_system = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  unset($mail_system['mymodule']);
  variable_set('mail_system', $mail_system);
}

Внутри «mymodule.module»:

class MymoduleMailSystem extends DefaultMailSystem {
  public function format(array $message) {
    $message['body'] = implode("\n\n", $message['body']);
    $message['body'] = drupal_wrap_mail($message['body']);
    return $message;
  }
}

Вам придется заменить экземпляры mymodule на фактическое имя вашего модуля, а затем отключить и снова включить модуль, чтобы изменить переменную, после чего все должно работать. Для полного примера вы можете проверить мой ответ здесь . Кроме того, эта страница на drupal.org откуда я и получил всю информацию.

Мадис
источник
2
Я следовал твоим инструкциям + полный пример, который ты привел, теперь все работает ... Большое спасибо.
mrcniceguy
7

Модуль Mime Mail - это почти наверняка то, что вы ищете.

Это компонентный модуль Mime Mail (для использования другими модулями).

  • Он позволяет пользователям получать электронную почту в формате HTML и может использоваться другими модулями. Функциональность почты принимает тело сообщения HTML, кодирует его и отправляет.
  • Если в HTML есть встроенная графика, эта графика кодируется MIME и включается в качестве вложения сообщения.
  • Принятие стиля вашего сайта путем автоматического включения файлов стилей вашей темы в формат сообщения HTML с возможностью тематического оформления.
  • Если предпочтения получателя доступны, и они предпочитают открытый текст, HTML будет преобразован в простой текст и отправлен как есть. В противном случае электронное письмо будет отправлено в тематическом HTML-формате с альтернативой в виде открытого текста.
  • Позволяет создавать темы сообщений с определенным почтовым ключом.
  • Преобразует стили CSS в атрибуты встроенного стиля.
  • Предоставляет простые системные действия и правила правил для отправки электронной почты в формате HTML со встроенными изображениями и вложениями.
Geoff
источник
5
я скачал модуль mimemail + почтовую систему ... не могли бы вы объяснить, как вызвать код mimemail для моего модуля, как показано выше.
mrcniceguy
3

Вы также можете посмотреть на модуль Swift Mailer. Он позволяет отправлять электронные письма в формате HTML с вложенными и обычными вложениями (такими как изображения или файлы). Кроме того, он также способен автоматически генерировать простые текстовые версии на основе электронной почты в формате HTML.

Вы можете взглянуть на это http://www.drupal.org/project/swiftmailer

Для записи: я являюсь автором и сопровождающим модуля.

sbrattla
источник
2

Вы не отправляете правильный HTML, вы включаете только теги H1 и B, вам, вероятно, нужно включить теги Full HTML, начиная с
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

GoodSp33d
источник
спасибо за ваш комментарий, я использовал пример @Dooshta, а также добавил правильный HTML, как вы предложили ... все работает.
mrcniceguy
Я уверен, что использование doctype & полностью проверяющего HTML не повредит, но отправлять HTML-сообщения через drupal не обязательно. Я только что удалил тег doctype & html и электронное письмо, хорошо отображаемое в Gmail и Outlook. Тем не менее , очень важно иметь исправление Dooshta: до того, как я реализовал эти изменения, я не смог вообще сгенерировать html.
doub1ejack
2

Ни один из вышеперечисленных ответов не сработал для меня, так что вот мой взгляд на оригинальный вопрос.

Прежде всего, установите и включите модуль Mime Mail . Вы можете прочитать README.txt для получения подробных инструкций по его использованию. Я дам вам короткую версию.

Вам необходимо включить Mime Mail для вашего модуля. Вы можете сделать это используя hook_enableили hook_update_Nв example.install:

function example_enable() {
  mailsystem_set(array(
    'example_send_gift' => 'MimeMailSystem',
  ));
}

Когда вы перейдете admin/config/system/mailsystemна страницу, вы увидите, что для вашего модуля была добавлена ​​новая запись:

Пример модуля (ключ send_gift)

MimeMailSystem

Теперь вам больше не нужно указывать какие-либо text/htmlзаголовки, Mime Mail позаботится об этом. Таким образом, вам не нужно это:

$message['headers']['Content-Type'] = ...

Если вы хотите, вы можете добавить $message['plaintext']к своей почте альтернативу, отличную от HTML, но это не обязательно.

Это оно!

Вим Мострей
источник