找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 27|回复: 0

[维护日志] [2026-05-11] [功能] [管理操作邮件通知] - 帖子管理操作邮件通知功能实现

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

9337

威望

7439

金钱

1万

贡献

管理员

自由的灵魂

积分
107425
主题
5630
回帖
26661
注册时间
2003-4-10
最后登录
2026-10-1
发表于 2026-5-12 00:01:06 | 显示全部楼层 |阅读模式

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

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

×

一、需求背景

论坛需要在对帖子执行管理操作时(如屏蔽、删除、移动、精华、置顶等)向帖子作者发送邮件通知,目的是吸引用户回流,让用户及时了解自己的帖子被管理的情况。

需求覆盖所有管理操作类型:
  • 面向回帖:屏蔽、解除屏蔽、删除回帖、置顶回复、警告
  • 面向主题:删除主题、关闭/打开、移动、置顶/解除置顶、精华/解除精华、推荐/解除推荐、高亮/解除高亮、分类、提升/下沉、定时操作等




二、技术难点

难点说明
操作入口分散管理操作有两个不同的入口:forum_topicadmin.php 处理回帖操作,topicadmin_moderate.php 处理主题操作
数据结构不同两个入口传入的数据格式完全不同,无法共用同一套函数
AJAX 干扰管理操作通过弹窗 AJAX 提交,邮件发送不能影响弹窗正常关闭
批量操作一次可操作多个帖子,需要合并同一用户的多个通知,超过阈值需入队
操作代码中文化Discuz! 中 $modaction 变量在翻译前是英文代码(如 BNP、DEL),翻译后变成中文,需在翻译前拦截





三、解决方案

3.1 两套函数分别处理不同入口

函数面向对象调用位置处理操作
send_topicadmin_notification回帖forum_topicadmin.php屏蔽、删除回帖、警告、置顶回复
send_topicadmin_notification_universal主题topicadmin_moderate.php删除主题、移动、置顶、精华、高亮等


为什么不能共用?
  • 数据格式不同:回帖传入 $resultarray['reasonpm']['data'],主题传入 $threadlist
  • 字段不同:回帖有 pid、first,主题没有;主题有 subject,回帖没有
  • 分开处理更清晰、更易维护

3.2 静默模式确保 AJAX 正常

  1. $is_ajax = !empty($_G['inajax']) || defined('IN_AJAX');
  2. if ($is_ajax) {
  3.     @error_reporting(0);
  4.     @ini_set('display_errors', 0);
  5. }
  6. // ... 邮件发送逻辑 ...
  7. if ($is_ajax) {
  8.     @error_reporting(E_ALL);
  9. }
复制代码


3.3 批量操作合并通知 + 阈值入队

  • 同一用户的多个帖子合并为一封邮件
  • 操作数 > 10 条时,邮件任务入队 pre_common_mail_queue,由 crontab 每5分钟发送
  • 操作数 ≤ 10 条时,直接发送

3.4 在翻译前调用(使用英文代码)

  1. // 在 topicadmin_moderate.php 中,翻译 $modaction 之前调用
  2. send_topicadmin_notification_universal($threadlist, $modaction);

  3. // 之后才翻译成中文用于站内通知
  4. $modactioncode = lang('forum/modaction');
  5. $modaction = $modactioncode[$modaction];
复制代码





四、涉及文件

文件绝对路径作用
forum_topicadmin.php/source/module/forum/forum_topicadmin.php主入口,定义两个函数,调用回帖通知
topicadmin_moderate.php/source/include/topicadmin/topicadmin_moderate.php主题操作入口,调用主题通知
function_delete.php/source/function/function_delete.php清理旧的删除邮件代码(已注释)





五、清理旧代码

function_delete.php 中原有的删除邮件通知代码已注释(实时发送、模板简陋、无操作人、无链接),统一由新函数处理。




六、调试日志

调试日志文件位置:/data/log/topicadmin_debug.log

  1. cat /data/log/topicadmin_debug.log
复制代码





七、技术沉淀

项目经验总结
数据格式分析先分析两个入口的数据结构差异,再设计函数
英文代码拦截在翻译前使用英文代码做映射,避免中文匹配问题
AJAX 静默邮件发送不能干扰 AJAX 响应,必须关闭错误输出
批量合并同一用户的多个通知合并为一封,避免邮件轰炸
队列阈值大量操作时入队而非实时发送,保证页面响应
函数分离数据格式不同时,宁可代码重复也要保持清晰





八、env-base 分支更新

已在以下章节补充:
  • 第九节(目录结构与关键路径):source/module/forum/forum_topicadmin.php、source/include/topicadmin/topicadmin_moderate.php 新增邮件通知函数
  • 第十二节(管理操作邮件通知):新增完整的技术说明




九、未来展望

  • 如需扩展更多操作类型,在 $action_map 映射表中补充即可
  • 如需修改邮件模板,在函数中的 $mail_message 构建部分调整
  • 如需调整队列阈值,修改 $batch_threshold = 10 即可
不懂就搜!点此搜点拨论坛。如果本坛没有,请尝试点此问AI,或跟帖提问。
发帖前注意看置顶帖。
不定期借助AI对点拨论坛陈年老帖进行挖坟回复,打扰勿怪!
帖中出现了你所不知道的生词怎么办?——先在点拨论坛搜索
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-10-2 00:39 , Processed in 0.049426 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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