找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 25|回复: 0

[维护日志] [2026-06-05] [功能] [跨国/跨地区登录邮件提醒] - 异地登录实时邮件通知功能实现

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

9337

威望

7448

金钱

1万

贡献

管理员

自由的灵魂

积分
107434
主题
5630
回帖
26661
注册时间
2003-4-10
最后登录
2026-10-2
发表于 2026-6-8 23:28:31 | 显示全部楼层 |阅读模式

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

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

×

1、问题缘起

论坛存在可疑用户注册后等待数天才发帖的情况,部分账号注册 IP 与后续登录 IP 跨越不同国家或地区。现有 Discuz! 系统仅在后台开启异地登录验证码功能,无法主动通知管理员,导致异常登录行为难以及时发现和处理。

探讨过程中发现的相关问题:

问题解决方案
首次登录用户无「上次登录IP」记录改用注册 IP 作为参照对象
香港、台湾被识别为「中国」,无法跨区判断自定义地区标准化函数,独立识别
首次登录邮件显示时间 1970-01-01改用注册时间作为参照时间
邮件为纯文本格式,信息拥挤改为 HTML 表格,三栏对照显示





2、解决方案

(1)简要技术分析:

在 Discuz! 登录验证流程中,利用已有的异地登录判断逻辑(比较本次登录 IP 与上次登录 IP 的归属地区),当地区发生变化时,通过邮件队列异步发送通知给管理员;首次登录用户则使用注册 IP 作为参照。

(2)修改文件列表:

操作文件路径
修改/source/class/class_member.php


(3)关键代码段:

地区标准化函数(将香港、台湾识别为独立地区):

  1. function custom_region($region) {
  2.     if (strpos($region, '香港') !== false) return '香港';
  3.     if (strpos($region, '台湾') !== false) return '台湾';
  4.     if (strpos($region, '澳门') !== false) return '澳门';
  5.     $spacePos = strpos($region, ' ');
  6.     if ($spacePos !== false) return substr($region, 0, $spacePos);
  7.     return $region;
  8. }
复制代码


异地登录判断与邮件发送(插入位置:异地登录验证码触发处):

  1. if ($lastRegion != $nowRegion) {
  2.     // 首次登录改用注册IP作为参照
  3.     if (empty($_G['member']['lastip']) || $lastFull == 'Invalid') {
  4.         $registerIp = C::t('common_member_status')->fetch($_G['uid'])['regip'];
  5.         if ($registerIp) {
  6.             $registerFull = convertip($registerIp);
  7.             $referenceRegion = custom_region($registerFull);
  8.             $referenceFull = $registerFull;
  9.             $referenceTime = $_G['member']['regdate'];
  10.         }
  11.     }
  12.    
  13.     if ($referenceRegion != $nowRegion) {
  14.         // 发送HTML格式邮件,表格展示IP、地区、时间三栏对比
  15.         sendmail($admin_email, $subject, $message);
  16.         $seccodecheck = true;  // 保留原验证码逻辑
  17.     }
  18. }
复制代码


邮件表格结构:

类型IP地址归属地区时间
上次登录/注册地区xxx.xxx.xxx.xxx美国2026-05-30 10:00:00
本次登录xxx.xxx.xxx.xxx台湾2026-06-05 07:02:35





3、最终实现效果

场景是否触发邮件参照对象
上次登录地区 ≠ 本次登录地区✅上次登录 IP 地区
首次登录 + 注册地区 ≠ 本次登录地区✅注册 IP 地区
首次登录 + 注册地区 = 本次登录地区❌不触发
地区相同(如北京 → 上海)❌不触发
中国 → 香港/台湾✅独立地区识别


邮件显示效果:

  • HTML 格式,卡片样式
  • 用户名可点击,跳转至用户个人资料页
  • IP、地区、时间三栏对照,上下结构清晰对比
  • 区分「上次登录地区」与「注册地区」两种对照类型




4、重要技术沉淀

需更新到固化摘要:

  1. 十六、跨国/跨地区登录邮件提醒(2026-06-05)

  2. 功能:用户异地登录时,自动发送邮件通知管理员
  3. 涉及文件:source/class/class_member.php
  4. 触发条件:本次登录地区与上次登录地区(或注册地区)不同
  5. 地区识别:香港、台湾、澳门独立,其他国家按首段识别
  6. 首次登录处理:无上次登录记录时,使用注册IP作为参照
  7. 邮件格式:HTML表格,IP、地区、时间三栏对照
  8. 管理员邮箱:admin@dianbo.org
复制代码


踩坑点:

踩坑正确做法
首次登录时上次登录IP为空,convertip() 返回 Invalid改用注册 IP 作为参照
香港、台湾地区被识别为「中国」,无法区分自定义函数提取关键词独立识别
首次登录邮件参照时间为 1970-01-01从 common_member 表取 regdate
纯文本邮件信息拥挤不易读改为 HTML 表格,三栏对照





5、进一步优化可能性

  • 频率限制:同一用户短时间内多次异地登录,仅首次发送邮件,避免轰炸
  • 白名单:允许设置信任地区(如国内切换省份不通知)
  • 管理面板开关:后台可配置是否开启此功能及管理员邮箱
  • 用户自通知:同时向用户本人发送提醒,告知账号可能被他人登录

不懂就搜!点此搜点拨论坛。如果本坛没有,请尝试点此问AI,或跟帖提问。
发帖前注意看置顶帖。
不定期借助AI对点拨论坛陈年老帖进行挖坟回复,打扰勿怪!
你的问题有多精彩,我的答复就有多精彩!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-10-2 03:30 , Processed in 0.103247 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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