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

Drupal 8.4普通用户密码重置链接失效与HTML邮件解析异常问题求助

解决Drupal密码重置链接邮件识别问题的几个方案

我之前也碰到过类似的Drupal邮件链接识别问题,给你几个亲测有效的解决方案:

一、调整邮件发送格式,确保HTML被正确解析

不管用默认PHP邮件还是SwiftMailer,核心是让邮件以HTML格式发送,避免被转成纯文本的引用格式:

  • 对于默认PHP邮件:进入/admin/config/system/mail,把默认邮件格式设置为HTML。如果没有这个选项,可能需要安装Mail System模块来扩展设置。
  • 对于SwiftMailer:
    1. 进入/admin/config/system/swiftmailer,找到「Message format」选项,选择「Both HTML and plain-text」(这个选项最稳妥,能同时兼容HTML和纯文本客户端)。
    2. 检查是否有其他模块(比如文本过滤模块)会剥离HTML标签,如果有的话,给邮件内容添加例外规则。

二、优化链接格式,避免客户端拆分URL

如果暂时不想用HTML邮件,或者想兼容纯文本客户端,可以这样调整:

  • 在纯文本模板里,把完整的重置URL单独放在一行,并用尖括号包裹,比如:<[user:one-time-login-url]>,绝大多数邮件客户端都会把这个识别成完整可点击的链接。
  • 如果用HTML模板,确保链接的href属性里没有换行,并且链接文本明确,比如:<a href="[user:one-time-login-url]">点击此处重置您的密码</a>,同时一定要保证邮件的Content-Type头是text/html。

三、用自定义代码强制控制邮件内容

如果上面的配置方法都不生效,可以写个简单的自定义模块来直接修改密码重置邮件的发送逻辑,避免模板解析的坑:
实现hook_mail_alter来覆盖默认的邮件内容和格式:

function my_custom_module_mail_alter(&$message) {
  // 只针对密码重置邮件生效
  if ($message['id'] == 'user_password_reset') {
    // 设置邮件为HTML格式
    $message['headers']['Content-Type'] = 'text/html; charset=UTF-8';
    
    // 直接生成一次性登录URL,避免模板变量解析问题
    $account = $message['params']['account'];
    $reset_url = $account->getOneTimeLoginUrl();
    
    // 重新构建邮件内容
    $message['body'] = [
      t('您好,'),
      t('请点击下面的链接重置您的密码:'),
      '<a href="' . $reset_url . '">' . t('立即重置密码') . '</a>',
      t('如果链接无法点击,请复制下面的URL到浏览器地址栏:'),
      '<p>' . $reset_url . '</p>',
    ];
  }
}

这个方法直接绕过了模板解析的问题,完全由你控制邮件的内容和格式,测试下来兼容性非常好。

四、测试建议

  • 测试时用不同的邮件客户端(Gmail、Outlook、苹果邮件)查看效果,确保所有客户端都能正确识别链接。
  • 可以用邮件测试工具查看邮件的原始内容,检查Content-Type头是否正确,链接有没有被拆分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:17:36