活力39282
在线时间13640 小时
阅读权限200
管理员
自由的灵魂
- 积分
- 107434
- 主题
- 5630
- 回帖
- 26661
- 注册时间
- 2003-4-10
- 最后登录
- 2026-10-2
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、需求背景
论坛需要在新回复时向主题作者(楼主)和被回复楼层作者(楼中楼)发送邮件通知。此前安装过第三方插件 [凹凸曼]邮件通知 1.6.0 (apoyl_email),该插件存在严重缺陷:
- 楼中楼回复时,点击“发表回复”按钮无响应,页面卡死无法提交
- 影响用户体验,导致楼中楼功能无法正常使用
二、解决方案
2.1 插件处理
| 操作 | 说明 | | 卸载插件 | 在 Discuz! 后台卸载 [凹凸曼]邮件通知 1.6.0 (apoyl_email) | | 清理文件 | 删除 /source/plugin/apoyl_email/ 整个目录 | | 清理数据库 | 检查 dx_common_plugin 表中是否残留插件记录 |
2.2 自建邮件通知功能
在 source/include/post/post_newreply.php 中直接嵌入邮件发送逻辑,替代第三方插件:
核心代码位置:post_newreply.php 末尾,$modpost->newreply() 执行之后
功能覆盖:
- 功能1:主题新回复通知楼主
- 功能2:楼中楼回复通知被回复楼层作者
2.3 SMTP 超时保护
为防止 SMTP 服务器响应慢阻塞发帖请求,添加了 socket 超时保护:
- // 设置 socket 超时保护,防止 SMTP 阻塞 AJAX 响应
- $old_socket_timeout = ini_get('default_socket_timeout');
- ini_set('default_socket_timeout', 5);
- loaducenter();
- include_once libfile('function/mail');
- @sendmail($toemail, $subject, $mail_message);
- // 恢复原始超时设置
- ini_set('default_socket_timeout', $old_socket_timeout);
复制代码
效果:
- SMTP 通信超过 5 秒自动超时放弃
- 使用 @ 静默抑制错误,不影响发帖主流程
- 用户点击“发表回复”后无需等待邮件发送完成
三、涉及文件
| 文件路径 | 作用 | | source/include/post/post_newreply.php | 回帖处理核心,新增邮件通知代码 | | source/plugin/apoyl_email/ | 已删除(问题插件) |
四、技术沉淀
| 项目 | 经验总结 | | 插件评估 | 第三方插件需充分测试,尤其是涉及流程中断的功能(如表单提交) | | 超时保护 | 同步发信时必须设置 socket 超时,否则 SMTP 故障会拖垮用户体验 | | 静默失败 | 邮件通知是辅助功能,不应影响主流程(发帖),失败应静默处理 | | 代码位置 | 邮件通知代码放在 $modpost->newreply() 之后、showmessage() 之前,确保 PID 已生成 |
五、env-base 分支更新
已在 第九节(目录结构与关键路径) 中补充:
- │ └── post/
- │ └── post_newreply.php # 回帖处理核心(含同步邮件通知 + 5秒SMTP超时保护)
复制代码
六、未来展望
- 如论坛规模扩大(日均回复 > 200),可考虑将回帖邮件改为队列模式(复用现有的 pre_common_mail_queue 基础设施)
- 若需增加更多邮件通知场景(如 @提及通知),可复用相同的超时保护模式
|
|