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

Drupal 9邮件Bcc功能失效问题求助

修复Drupal邮件密送(Bcc)不生效问题

问题原因

你调用的是system模块的mail邮件键(\Drupal::service('plugin.manager.mail')->mail('system', 'mail', ...)),但你的mymodule_mail钩子只会在调用你的模块定义的邮件键时触发,所以当前设置的Bcc根本没被应用到实际发送的邮件上。

解决方案

方案1:使用hook_mail_alter修改邮件头部

既然要修改系统邮件的Bcc,直接用hook_mail_alter拦截并添加Bcc:

function mymodule_mail_alter(&$message) {
  // 只针对特定邮件场景修改,避免影响所有邮件
  if ($message['id'] == 'system_mail' && !empty($message['params']['context']['Bcc'])) {
    $message['headers']['Bcc'] = $message['params']['context']['Bcc'];
    // 保留需要的其他头部设置
    $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed; delsp=yes';
    $message['from'] = \Drupal::config('system.site')->get('mail');
  }
}

方案2:自定义模块的邮件键(推荐)

更规范的做法是使用自己模块的邮件键,确保mymodule_mail能正常触发:

  1. 修改notify_new_resources方法中的邮件调用,把模块名改为mymodule:
function notify_new_resources(EntityInterface $entity, $mode) {
  $langcode = \Drupal::currentUser()->getPreferredLangcode();
  $params['context']['subject'] = t('A new resource has been created!');
  $params['context']['message'] = 'A new resource has been created blah blah blah...';
  $to = 'myaddress@somedomain.com';
  $params['context']['Bcc'] = $s_recipients; // 确保$s_recipients是正确的邮箱列表,多个用逗号分隔
  // 模块名改为mymodule,自定义邮件键为resource_notification
  \Drupal::service('plugin.manager.mail')->mail('mymodule', 'resource_notification', $to, $langcode, $params);
}
  1. 调整mymodule_mail钩子,匹配自定义的邮件键:
function mymodule_mail($key, &$message, $params) {
  // 只处理自定义的邮件键
  if ($key == 'resource_notification') {
    $options = array(
      'langcode' => $message['langcode'],
    );
    $message['headers']['Content-Type'] = 'text/html; charset=UTF-8; format=flowed; delsp=yes';
    $message['from'] = \Drupal::config('system.site')->get('mail');
    $message['headers']['Bcc'] = $params['context']['Bcc'];
    $message['subject'] = $params['context']['subject'];
    $message['body'][] = $params['context']['message'];
  }
}

额外注意事项

  • 确保$s_recipients格式正确:单个邮箱字符串,或多个邮箱用逗号分隔(如'user1@example.com,user2@example.com')
  • 测试前可开启Drupal邮件日志(/admin/config/system/mail-logging),查看实际发送的邮件头部是否包含Bcc

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:01:09