活力39282
在线时间13640 小时
阅读权限200
管理员
自由的灵魂
- 积分
- 107434
- 主题
- 5630
- 回帖
- 26661
- 注册时间
- 2003-4-10
- 最后登录
- 2026-10-2
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1、问题缘起
论坛已有主题回复邮件通知、回帖管理邮件通知、评分邮件通知功能,但缺少「点评」功能的邮件通知。用户发布点评后,被点评方只能收到站内通知,无法通过邮件及时知晓,导致互动响应延迟。
讨论过程中发现的相关问题:
| 问题 | 解决方案 | | 点评邮件链接只带 tid,无法定位到具体回帖 | 改为 redirect 链接,同时携带 tid 和 pid | | 邮件队列固定 5 分钟发送一次,体验差 | 改为每分钟执行 + 随机休眠 0-59 秒,间隔 60-119 秒 | | 邮件内容中出现语法错误导致无法提交 | 修正字符串拼接中的单引号位置错误 |
2、解决方案
(1)简要技术分析:
在点评处理逻辑的站内通知代码后,增加邮件入队代码,利用现有 common_mail_queue 异步发送,不阻塞点评提交。
(2)修改、新增文件列表:
| 操作 | 文件路径 | 说明 | | 修改 | /source/include/post/post_newreply.php | 添加点评邮件通知代码 | | 修改 | /api/mail_queue_cli.php | 添加随机休眠,优化发送间隔 | | 修改 | Crontab | 将邮件队列执行间隔从 5 分钟改为 1 分钟 |
(3)关键代码段:
点评邮件通知代码(插入位置:notification_add 之后):
- // ========= 点评邮件通知 =========
- $author_info = C::t('common_member')->fetch($post['authorid']);
- if ($author_info && !empty($author_info['email'])) {
- $mail_subject = '您在 『' . $_G['forum']['name'] . '』 的帖子被点评';
- $mail_message = "<html><body>";
- $mail_message .= "<p>尊敬的 " . $author_info['username'] . ",您好:</p>";
- $mail_message .= "<p>您在 『" . $_G['forum']['name'] . "』 发布的帖子被 <strong>" . $_G['username'] . "</strong> 点评:</p>";
- $mail_message .= "<div style='background:#f5f5f5;padding:10px;margin:10px 0;border-left:3px solid #d9534f;'>" . nl2br(htmlspecialchars($comment)) . "</div>";
- $mail_message .= "<p>查看详情:<a href="" . $_G['siteurl'] . "forum.php?mod=redirect&goto=findpost&ptid=" . $_G['tid'] . "&pid=" . $_GET['pid'] . "">" . $_G['siteurl'] . "forum.php?mod=redirect&goto=findpost&ptid=" . $_G['tid'] . "&pid=" . $_GET['pid'] . "</a></p>";
- $mail_message .= "<p>期待您继续参与社区讨论。</p>";
- $mail_message .= "</body></html>";
-
- C::t('common_mail_queue')->insert(array(
- 'uid' => $author_info['uid'],
- 'toemail' => $author_info['email'],
- 'username' => $author_info['username'],
- 'subject' => $mail_subject,
- 'message' => $mail_message,
- 'dateline' => TIMESTAMP,
- 'status' => 0,
- ));
- }
- // ========= 点评邮件通知结束 =========
复制代码
邮件队列随机休眠(mail_queue_cli.php 开头):
- // 随机休眠 0-59 秒,避免多服务器同时执行
- sleep(rand(0, 59));
复制代码
Crontab 配置:
- * * * * * /usr/bin/php /api/mail_queue_cli.php >> /www/wwwlogs/mail_queue.log 2>&1
复制代码
3、最终实现效果
| 对比项 | 优化前 | 优化后 | | 点评邮件 | ❌ 无 | ✅ 异步发送 | | 邮件中链接 | — | 直接定位到被点评楼层 | | 邮件发送间隔 | 5 分钟 | 60-119 秒(随机) | | 对被点评方 | 仅站内通知 | 站内通知 + 邮件通知 |
4、重要技术沉淀
需更新到固化摘要:
- 十九、点评邮件通知(2026-06-08)
- 功能:帖子被点评时,通过邮件队列异步通知被点评方
- 涉及文件:source/include/post/post_newreply.php
- 链接格式:forum.php?mod=redirect&goto=findpost&ptid={tid}&pid={pid}
- 邮件队列间隔:Crontab 每分钟执行,脚本内随机休眠 0-59 秒
复制代码
踩坑点:
- 邮件链接必须同时携带 tid 和 pid,否则无法定位到具体回帖楼层
- 字符串拼接时注意单引号与双引号的嵌套,避免 PHP 语法错误
- 邮件队列执行过于频繁会占用服务器资源,随机休眠可打散请求
5、进一步优化可能性
- 将邮件模板内容存入数据库,支持后台在线编辑
- 为点评邮件增加「批量合并」功能,同一用户多条点评合并为一封邮件
- 支持版块级别的开关控制(某些版块关闭点评邮件通知)
|
|