You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drupal 编程实现邮件发送功能相关教程求助

Drupal自定义模块实现HTML邮件(Twig模板+REST触发)开发指南

1. 基础问题答疑

1.1 hook_mail()的存放规则

hook_mail()属于Drupal核心钩子函数,不需要放在src目录下,直接存放在自定义模块根目录的[你的模块名].module文件中即可。所有非类形式实现的Drupal钩子都遵循这个存放规则,和src目录下的表单类、插件类存放逻辑不同。

1.2 邮件管理器的属性说明

\Drupal::service('plugin.manager.mail')是Drupal核心内置服务,不需要额外安装第三方插件。默认输出纯文本内容,要支持HTML格式邮件只需在hook_mail()中添加对应Content-Type头即可,如果你使用Drupal10,自带的Symfony Mailer服务对HTML邮件的适配更友好,无需额外手动配置头信息。

2. Twig模板注册与数据注入流程

2.1 注册自定义邮件模板

在自定义模块根目录的[你的模块名].module中实现hook_theme(),注册你要用到的邮件Twig模板:

/**
 * Implements hook_theme().
 */
function your_module_name_theme($existing, $type, $theme, $path) {
  return [
    // 自定义模板标识,后续渲染时调用
    'custom_notification_mail' => [
      'variables' => [
        // 按业务需求定义要传入的占位符变量
        'user_nickname' => '',
        'mail_content' => '',
        'action_link' => '',
      ],
      // 模板文件存放在模块根目录的templates文件夹下,文件名为custom-notification-mail.html.twig
      'template' => 'custom-notification-mail',
    ],
  ];
}

2.2 创建Twig模板文件

在自定义模块根目录新建templates文件夹,创建custom-notification-mail.html.twig文件,编写HTML格式的邮件内容,占位符直接使用{{ 变量名 }}即可:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>站点通知</title>
</head>
<body>
  <h2>您好 {{ user_nickname }}</h2>
  <div class="mail-body">
    {{ mail_content | raw }}
  </div>
  <p>点击前往:<a href="{{ action_link }}">{{ action_link }}</a></p>
</body>
</html>

2.3 模板渲染与数据注入

调用渲染服务即可传入自定义数据,把Twig模板渲染为HTML字符串:

// 构造渲染数组,传入自定义数据
$render_arr = [
  '#theme' => 'custom_notification_mail',
  '#user_nickname' => '测试用户',
  '#mail_content' => '这是你要的邮件正文内容',
  '#action_link' => '你的站点内部地址',
];
// 渲染得到完整的HTML邮件内容
$mail_html = \Drupal::service('renderer')->renderRoot($render_arr);

3. hook_mail()实现示例

还是在[你的模块名].module文件中编写钩子逻辑:

/**
 * Implements hook_mail().
 */
function your_module_name_mail($key, &$message, $params) {
  switch ($key) {
    // 自定义邮件标识,发送调用时要和这个值对应
    case 'user_notification':
      $message['subject'] = $params['mail_subject'];
      // 传入渲染好的HTML内容
      $message['body'][] = $params['mail_body'];
      // 配置HTML邮件头,用Symfony Mailer可省略这行
      $message['headers']['Content-Type'] = 'text/html; charset=UTF-8';
      break;
  }
}

4. 邮件发送调用(可直接用于REST接口逻辑)

在你的REST接口处理逻辑中加入以下代码即可触发邮件发送:

// 按业务逻辑获取参数,渲染得到邮件HTML内容
$render_arr = [
  '#theme' => 'custom_notification_mail',
  '#user_nickname' => $receive_user->getDisplayName(),
  '#mail_content' => $rest_request_params['content'],
  '#action_link' => $rest_request_params['link'],
];
$mail_body = \Drupal::service('renderer')->renderRoot($render_arr);

// 调用邮件服务发送
$mail_manager = \Drupal::service('plugin.manager.mail');
$mail_result = $mail_manager->mail(
  'your_module_name', // 你的模块名
  'user_notification', // 和hook_mail里的key对应
  'receive@example.com', // 收件人邮箱
  \Drupal::currentUser()->getPreferredLangcode(),
  [
    'mail_subject' => '自定义站点通知',
    'mail_body' => $mail_body,
  ],
  NULL,
  TRUE
);

注意事项

  • Twig模板中如果要输出富文本内容,需要加| raw过滤器,否则HTML标签会被自动转义
  • 模板修改后需要清除Drupal缓存才会生效
  • 邮件发送前建议先配置好站点的发件人地址,避免被判定为垃圾邮件

内容的提问来源于stack exchange,提问作者AmrVOIS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:36:03