如何发送HTML电子邮件


25

我正在创建一个简单的模块,它将向我们的网站中的交易发送HTML电子邮件给用户。

我已经搜索了很多,但是找不到适合Drupal的解决方案。现在我可以发送邮件,但只能发送纯文本。

在Drupal 7中发送HTML电子邮件的分步过程是什么?

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;
    }
}

您没有通过完整的HTML页面
GoodSp33d 2012年

Answers:


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 2012年

7

Mime Mail模块几乎可以肯定是您想要的。

这是Mime Mail组件模块(供其他模块使用)。

  • 它允许用户接收HTML电子邮件,并且可以被其他模块使用。邮件功能接受HTML消息正文,对它进行mime-endcode并发送。
  • 如果HTML具有嵌入式图形,则这些图形将进行MIME编码并作为消息附件包含在内。
  • 通过以主题化HTML消息格式自动包含主题的样式表文件来采用网站的样式
  • 如果收件人的首选项可用,并且他们喜欢纯文本,则HTML将转换为纯文本并按原样发送。否则,电子邮件将以主题化的HTML格式发送,并带有纯文本格式。
  • 允许您使用特定的邮件密钥作为主题消息。
  • 将CSS样式转换为嵌入式样式属性。
  • 提供简单的系统操作和“规则”操作,以发送带有嵌入式图像和附件的HTML电子邮件。

5
我已经下载了mimemail模块+邮件系统...请您以上面的代码解释将mimemail函数调用到我的模块中。
mrcniceguy 2012年

3

您可能还需要查看Swift Mailer模块。它使您可以发送带有内联附件和常规附件(例如图像或文件)的HTML电子邮件。此外,它还能够基于HTML电子邮件自动生成纯文本版本。

您可以看看它http://www.drupal.org/project/swiftmailer

记录:我是该模块的作者和维护者。


2

您没有发送正确的HTML,仅包含H1标签和B标签,您可能还需要包含完整的HTML标签,并且从
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


谢谢您的评论,我使用@Dooshta示例,还根据您的建议添加了适当的html。
mrcniceguy 2012年

我确信使用doctype和完全验证HTML不会有任何危害,但是不需要通过drupal发送HTML电子邮件。我刚刚删除了doctype和html标记,并在Gmail和Outlook中很好地呈现了电子邮件。但是,拥有适当的Dooshta修复程序非常重要:在实施这些更改之前,我根本无法生成任何html。
doub1ejack

2

上面的答案对我都不起作用,因此这是我对原始问题的看法。

首先,安装并启用Mime Mail模块。您可以阅读README.txt以获得有关如何使用它的完整说明。我给你简短的版本。

您需要为模块启用Mime Mail。您可以使用hook_enablehook_update_N在中进行此操作example.install

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

当您转到时,admin/config/system/mailsystem将看到为模块添加了新条目:

示例模块(send_gift键)类

MimeMail系统

现在,您不再需要指定任何text/html标题了,Mime Mail会处理这一问题。因此,您不需要:

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

如果需要,可以将$message['plaintext']您的邮件添加为非HTML替代方案,但这不是必需的。

而已!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.