找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 27|回复: 1

[维护日志] [2026-05-15] [修复] [回帖邮件链接] - 修复回帖通知邮件中主题链接缺失tid并添加安全提示

[复制链接]
  • 打卡等级:本地老炮

9337

威望

7448

金钱

1万

贡献

管理员

自由的灵魂

积分
107434
主题
5630
回帖
26661
注册时间
2003-4-10
最后登录
2026-10-2
发表于 2026-5-15 08:50:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

[2026-05-15] [修复] [回帖邮件链接] - 修复回帖通知邮件中主题链接缺失tid及redirect链接参数错误


1、问题缘起

用户反馈回帖通知邮件中存在两个问题:
  • 问题一:主题链接中 tid= 后面没有数值(如 thread-)
  • 问题二:部分链接被QQ邮箱/QQ浏览器误报为“不安全”,需要添加操作提示

在排查过程中发现更深层问题:
  • 问题三:功能1(主题新回复)中“点击这里查看回复详情”链接的 ptid= 和 pid= 参数全部错误(ptid= 用了未定义的 $tid,pid= 错误地用了 $_G['tid'])
  • 问题四:功能2(楼中楼回复)中同样存在参数错误




2、解决方案

(1)简要技术分析

在 post_newreply.php 的邮件通知代码段中,将所有链接的参数统一修正:标题类链接使用 viewthread 模式(仅需 tid),详情链接使用 redirect 模式(需要 ptid + pid),并将未定义变量 $tid 替换为全局变量 $_G['tid'],将错误赋值的 $_G['tid'] 替换为正确的 $pid。

(2)修改文件列表

文件路径修改类型
/source/include/post/post_newreply.php修改代码


(3)关键修改代码段

功能1(主题新回复通知)- 约第528-534行:
  1. // 主题链接(viewthread格式)- 原本已正确
  2. $mail_message .= '<p>您发布的主题“<a href="' . $_G['siteurl'] . 'thread-' . $_G['tid'] . '">' . $thread['subject'] . '</a>”收到了一条新回复。</p>';

  3. // 回复详情链接(redirect格式)- 修复后
  4. $mail_message .= '<p><a href="' . $_G['siteurl'] . 'forum.php?mod=redirect&goto=findpost&ptid=' . $_G['tid'] . '&pid=' . $pid . '">点击这里查看回复详情</a></p>';

  5. // 安全提示(颜色使用red,兼容性最佳)
  6. $mail_message .= '<p style="color:red; font-size:12px;">※ 如果点击上方链接被提示“不安全”,请右键点击链接,选择“在新标签页中打开链接”即可正常访问。</p>';
复制代码


功能2(楼中楼回复通知)- 约第558-562行:
  1. // “您在帖子...”中的标题链接(viewthread格式)- 修复后
  2. $mail_message .= '<p>您在帖子“<a href="' . $_G['siteurl'] . 'thread-' . $_G['tid'] . '">' . $thread['subject'] . '</a>”中发表的回复,被 <strong>' . $_G['username'] . '</strong> 回复了。</p>';

  3. // 回复详情链接(redirect格式)- 修复后
  4. $mail_message .= '<p><a href="' . $_G['siteurl'] . 'forum.php?mod=redirect&goto=findpost&ptid=' . $_G['tid'] . '&pid=' . $pid . '">点击这里查看回复详情</a></p>';
复制代码





3、最终实现效果

邮件场景链接类型修复前修复后
主题新回复 - 主题标题viewthreadtid= 后为空tid=123 ✅
主题新回复 - 查看详情redirectptid= 空 + pid= 错误(用了tid)ptid=123&pid=456 ✅
楼中楼回复 - 被回复帖子标题viewthreadptid= 空(用了redirect模式)tid=123 ✅
楼中楼回复 - 查看详情redirectptid= 空 + pid= 错误ptid=123&pid=456 ✅
安全提示文字颜色无红色提示文字,引导用户右键打开 ✅





4、重要技术沉淀

Discuz! 中 $tid 与 $_G['tid'] 的区别:
  • $_G['tid'] 是全局变量,在整个请求生命周期中始终可用
  • $tid 仅在特定作用域(如某些循环或函数参数)中定义,在 post_newreply.php 的邮件通知代码段中 $tid 未定义,使用会导致空值输出

链接模式选择:
  • viewthread 模式(mod=viewthread&tid=xxx):跳转到主题首页,适合主题标题链接
  • redirect 模式(mod=redirect&goto=findpost&ptid=xxx&pid=xxx):精确跳转到指定楼层,适合“查看详情”链接

无需更新固化摘要(本次修改属于邮件内容的微调,不影响系统核心行为)




5、进一步优化的可能性

  • 可考虑将邮件模板抽取为独立函数或模板文件,避免在核心流程文件中硬编码HTML
  • 可考虑在后台增加“邮件链接安全提示”开关,允许站长自定义提示文字和颜色
  • 目前两处邮件通知代码存在重复(功能1和功能2),可考虑合并为统一的邮件发送函数



附:// 安全提示 也同时添加在评分邮件中:
/www/wwwroot/www.dianbo.org/source/module/forum/forum_misc.php
不懂就搜!点此搜点拨论坛。如果本坛没有,请尝试点此问AI,或跟帖提问。
发帖前注意看置顶帖。
不定期借助AI对点拨论坛陈年老帖进行挖坟回复,打扰勿怪!
草率的提问只能得到草率的回答
  • 打卡等级:本地老炮

9337

威望

7448

金钱

1万

贡献

管理员

自由的灵魂

积分
107434
主题
5630
回帖
26661
注册时间
2003-4-10
最后登录
2026-10-2
 楼主| 发表于 2026-5-15 08:51:58 | 显示全部楼层

为什么$pid还能使用?

好问题!$pid 能使用的原因在于代码执行顺序和变量作用域。
原理分析
在 post_newreply.php 中,$pid 的赋值发生在邮件通知代码之前:
  1. $return = $modpost->newreply($params);
  2. $pid = $modpost->pid;   // ← 这里 $pid 被赋值
复制代码

这行代码执行后,$pid 就在当前脚本的全局作用域中成为一个普通变量。
随后邮件通知代码段在同一作用域内执行:
  1. // ========== 邮件通知功能 ==========
  2. // ...
  3. $mail[i]message .= '<p><a href="... ptid=' . $[/i]G['tid'] . '&pid=' . $pid . '">...';
复制代码

此时 $pid 仍然存在于变量表中,因此可以正常使用。
为什么 $tid 不能用?
$tid 在 post_newreply.php 中从未被赋值。
Discuz! 中的主题ID统一存储在全局数组 $G['tid'] 中,而不是单独的 $tid 变量。你可能在其他文件中见过 $tid(比如某些循环或函数参数),但在 postnewreply.php 的这个作用域里,$tid 没有被定义。
总结
变量是否可用原因
$pid✅ 可用第 416 行 $pid = $modpost->pid; 显式赋值
$tid❌ 不可用本文件中从未定义,只有 $_G['tid']
$_G['tid']✅ 可用全局数组,始终可用

所以不是 $pid 特殊,而是它恰好被赋值了。如果你在邮件代码之后尝试使用 $pid 也会失效(因为超出作用域),但你的邮件代码在赋值之后、脚本结束之前,所以没问题。
不懂就搜!点此搜点拨论坛。如果本坛没有,请尝试点此问AI,或跟帖提问。
发帖前注意看置顶帖。
不定期借助AI对点拨论坛陈年老帖进行挖坟回复,打扰勿怪!
回复 顶 踩

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|点拨论坛 |网站地图

GMT+8, 2026-10-2 02:48 , Processed in 0.075783 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表