本人回复自己的反馈不发通知信

用户:「他自己回复他自己的反馈,不要再给他发邮件了 ——
      他自己说的,他发给他自己,不是很奇怪吗?但如果是别人回复他的,就可以发。」

原逻辑在 mailer 里有个「自己通知自己」判断,但写成了:
  !empty($extra["is_admin"]) === false
双重否定绕,读起来要停一下才知道在判什么,而且没有覆盖空格差异。

改法:
- 改成直接判 $isAdminNotice,条件意图一眼可见
- 邮箱比较前 trim + strcasecmp,覆盖 大小写不同 / 前后空格 两种写法
- 拦下时写 notify_log 并给出明确原因「本人回复自己的反馈,不发信」,
  以后排查「为什么没收到信」能直接看到

验证(5 种情形 + 完整 DB 路径):
  同邮箱 → 拦下;大小写不同 → 拦下;带空格 → 拦下;
  别人邮箱 → 正常发;管理员邮箱 → 正常通知提交人。
  另在库里真插一条本人回复走 fb_notify_event,同样被拦下。

关于「带 token 能否修改原反馈」:确认后决定不做。
理由:反馈一旦公开,别人已看过/回复过,改了会让讨论对不上号;
补充信息用回复完全够用。现状只能看和回复。
This commit is contained in:
2026-11-03 10:48:07 +08:00
parent 8b3e49e091
commit 0dc8033c6b
2 changed files with 22 additions and 7 deletions
+21 -6
View File
@@ -737,12 +737,27 @@ if (!function_exists('fb_notify_event')) {
return [false, $why];
}
// ---- 3. 自己通知自己就别发了 ----
if (!$isAdminNotice && !empty($extra['is_admin']) === false
&& !empty($extra['reply']['author_email'])) {
if (strcasecmp(trim((string)$extra['reply']['author_email']), $to) === 0) {
$log($to, 0, '自己回复自己,不发');
return [false, '自己回复自己,不发'];
/* ---- 3. 自己通知自己就别发了 ----
*
* 用户 2026-11-03:「他自己回复他自己的反馈,不要再给他发邮件了 ——
* 他自己说的,他发给他自己,不是很奇怪吗?但如果是别人回复他的,
* 就可以给他发邮件。」
*
* 覆盖三种「其实是同一个人」的情形:
* ① 提交人自己回复(带 token 进来,服务端会把邮箱强制设为原作者);
* ② 回复者填的邮箱与提交人相同(普通访客碰巧同邮箱);
* ③ 邮箱大小写 / 前后空格不同(DAO@x.com vs dao@x.com)。
*
* ⚠️ 旧写法是 `!empty($extra['is_admin']) === false` —— 双重否定绕,
* 读起来要停一下才知道在判什么。这里改成直接判 is_admin。
* ⚠️ 官方(管理员)回复不在豁免之列:管理员邮箱通常与提交人不同,
* 但万一相同(管理员给自己提的反馈回复),也不该给自己发信。 */
if (!$isAdminNotice) {
$replyMail = isset($extra['reply']['author_email'])
? trim((string)$extra['reply']['author_email']) : '';
if ($replyMail !== '' && strcasecmp($replyMail, $to) === 0) {
$log($to, 0, '本人回复自己的反馈,不发信');
return [false, '本人回复自己的反馈,不发信'];
}
}