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
相关产品推荐
相关产品推荐

