网站后台异地登录提醒,邮件推送登录通知
网站后台如果只靠账号密码保护,一旦密码泄露,攻击者从异地登录你往往毫无察觉。
本文面向零基础站长,讲清楚如何通过邮件推送实现后台异地登录提醒,涵盖宝塔面板邮件配置、登录监控脚本编写、定时任务部署和验证方法。
跟着做完,你就能在有人异地登录后台时收到邮件通知。
准备工作:确认环境与邮件通道
动手之前先确认两件事:服务器能发邮件,以及你知道后台登录日志存在哪。
- 服务器环境:本文以宝塔面板(Linux 版)为例,其他面板或纯命令行环境思路类似,路径需自行调整。
- 邮件发送方式:推荐用 SMTP 发信。你需要一个支持 SMTP 的邮箱,比如 QQ 邮箱、163 邮箱或企业邮。以 QQ 邮箱为例,进入
设置→账户,开启SMTP 服务,生成一串 授权码,后面脚本里用授权码而不是邮箱密码。 - 登录日志位置:不同程序日志不同。常见的有宝塔面板自身的
/www/server/panel/logs/request/下的登录日志,或网站程序自带的admin登录记录表。本文以宝塔面板登录日志为例。
提示:如果服务器是全新环境,先执行apt install mailutils或yum install mailx安装基础邮件客户端,但用脚本发信更灵活。
配置邮件推送:用 Python 脚本发送登录通知
宝塔面板自带 Python 环境,我们直接写一个发信脚本。
登录服务器 SSH,执行 mkdir -p /www/wwwroot/login_alert 创建目录,然后新建脚本文件 vi /www/wwwroot/login_alert/send_mail.py,粘贴以下内容:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import sys
# 邮件配置
smtp_server = 'smtp.qq.com'
smtp_port = 465
sender = '你的邮箱@qq.com'
password = '你的SMTP授权码'
receiver = '接收通知的邮箱@qq.com'
# 获取登录信息
login_ip = sys.argv[1] if len(sys.argv) > 1 else '未知IP'
login_time = sys.argv[2] if len(sys.argv) > 2 else '未知时间'
subject = '网站后台异地登录提醒'
body = f'你的网站后台在 {login_time} 有登录行为,登录IP:{login_ip}。如非本人操作,请立即修改密码。'
msg = MIMEText(body, 'plain', 'utf-8')
msg['From'] = Header(sender)
msg['To'] = Header(receiver)
msg['Subject'] = Header(subject, 'utf-8')
try:
smtp = smtplib.SMTP_SSL(smtp_server, smtp_port)
smtp.login(sender, password)
smtp.sendmail(sender, [receiver], msg.as_string())
smtp.quit()
print('邮件发送成功')
except Exception as e:
print('发送失败:', e)
保存后,先手动测试一下:python3 /www/wwwroot/login_alert/send_mail.py 123.123.123.123 "2025-01-01 10:00:00"。
如果接收邮箱能收到提醒邮件,说明邮件通道已经打通。关键点:授权码不要写错,QQ 邮箱的 SMTP 端口用 465。
监控登录日志并触发通知
邮件能发出去之后,需要让脚本在有人登录时自动执行。
宝塔面板的登录日志在 /www/server/panel/logs/request/ 目录下,按日期命名。
我们可以写一个监控脚本,检测到新登录记录就调用发信脚本。
新建 vi /www/wwwroot/login_alert/check_login.sh,内容如下:
#!/bin/bash
LOG_DIR="/www/server/panel/logs/request"
TODAY=$(date +%Y-%m-%d)
LOG_FILE="$LOG_DIR/$TODAY.log"
LAST_FILE="/www/wwwroot/login_alert/last_line.txt"
if [ ! -f "$LOG_FILE" ]; then
exit 0
fi
CURRENT_LINES=$(wc -l < "$LOG_FILE")
if [ -f "$LAST_FILE" ]; then
LAST_LINES=$(cat "$LAST_FILE")
else
LAST_LINES=0
fi
if [ "$CURRENT_LINES" -gt "$LAST_LINES" ]; then
# 提取新增行中的登录IP和时间,这里简化处理,取最后一行
NEW_LINE=$(tail -n 1 "$LOG_FILE")
IP=$(echo "$NEW_LINE" | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' | head -1)
TIME=$(date '+%Y-%m-%d %H:%M:%S')
python3 /www/wwwroot/login_alert/send_mail.py "$IP" "$TIME"
fi
echo "$CURRENT_LINES" > "$LAST_FILE"
赋予执行权限:chmod +x /www/wwwroot/login_alert/check_login.sh。
这个脚本会记录上次读取的行数,发现新增登录记录就发邮件。
设置定时任务与效果验证
脚本写好了,用 crontab 让它每分钟检查一次。
执行 crontab -e,添加一行:
* * * * * /bin/bash /www/wwwroot/login_alert/check_login.sh >/dev/null 2>&1
保存退出。
然后手动触发一次登录测试:退出宝塔面板,重新登录。
等待一分钟左右,检查接收邮箱是否收到主题为“网站后台异地登录提醒”的邮件。
如果没收到,按下面顺序排查:
- 检查脚本权限:确保
check_login.sh有执行权限,send_mail.py能被 python3 正常调用。 - 查看日志:手动执行
bash -x /www/wwwroot/login_alert/check_login.sh,看输出是否有报错;同时检查/var/log/cron里任务是否执行。 - 邮件拦截:QQ 邮箱可能把通知邮件放进垃圾箱,检查垃圾邮件文件夹,并把发件人加入白名单。
- IP 提取失败:如果日志格式不同,
grep提取 IP 可能为空,此时邮件仍会发送但 IP 显示“未知”。需要根据实际日志调整正则。
判断条件:只要手动执行发信脚本能收到邮件,且定时任务在运行,异地登录提醒就能生效。
避坑与安全加固建议
这套方案本质是“日志监控 + 邮件通知”,部署时注意以下几点:
- 授权码泄露风险:不要把含授权码的脚本放在 Web 可访问目录,建议放在
/www/wwwroot之外,比如/root/scripts/。 - 日志轮转:宝塔日志按天分割,脚本只检查当天文件,跨天时
last_line.txt需要重置,可在脚本开头判断日期变化并清零。 - IP 归属地:邮件里只显示 IP,如果想显示归属地,可以调用公开 IP 库 API,但注意隐私和频率限制。
- 多重验证:邮件提醒只是事后通知,建议同时开启宝塔的二次验证或修改默认端口,降低被扫描风险。
另一个可独立摘录的结论:异地登录提醒不能替代强密码和二次验证,它只是让你更快发现异常。
常见疑问
问:没有宝塔面板,纯 LNMP 环境怎么实现?
答:思路一样,找到你的网站程序登录日志路径,比如 WordPress 可以监控 wp_users 表的 user_registered 或安装登录日志插件,然后用同样的脚本逻辑发邮件。
问:邮件发送频率太高怎么办?
答:可以在脚本里加一个判断,比如同一 IP 5 分钟内只发一次,用临时文件记录时间戳。
问:能改成微信推送吗?
答:可以,把发信部分换成企业微信机器人或 Server 酱的 API 调用,但需要额外申请和配置,新手建议先用邮件跑通。
问:为什么登录了却没收到邮件?
答:先手动执行 check_login.sh 看是否有输出,再检查 crontab 是否写对,最后确认日志文件路径和格式是否匹配。
按照以上步骤,你就能为网站后台加上异地登录邮件提醒。
整个过程不复杂,关键是邮件通道要通、日志路径要对、定时任务要跑起来。
配置完成后,建议再故意异地登录一次,确认邮件能正常送达。