修复邮箱验证码日期解析 BUG:旧邮件完整时间戳格式无法解析,导致每次命中同一旧验证码

- 新增 YYYY-MM-DD HH:MM 和 YYYY-MM-DD HH:MM:SS 格式解析
- 新增 MM-DD HH:MM 格式解析
- 日期无法解析时跳过该邮件而非放行(安全兜底)
This commit is contained in:
yml2213
2026-07-24 20:42:57 +08:00
parent 62099e8d68
commit 781ad74762
+23 -1
View File
@@ -305,6 +305,18 @@ class EmailVerifier:
except ValueError: except ValueError:
pass pass
# 日期格式 2026-06-20 14:30
try:
return datetime.strptime(date_str.strip(), "%Y-%m-%d %H:%M")
except ValueError:
pass
# 日期格式 2026-06-20 14:30:00
try:
return datetime.strptime(date_str.strip(), "%Y-%m-%d %H:%M:%S")
except ValueError:
pass
# 日期格式 06-20 # 日期格式 06-20
try: try:
dt = datetime.strptime(date_str.strip(), "%m-%d") dt = datetime.strptime(date_str.strip(), "%m-%d")
@@ -312,6 +324,13 @@ class EmailVerifier:
except ValueError: except ValueError:
pass pass
# 日期格式 06-20 14:30
try:
dt = datetime.strptime(date_str.strip(), "%m-%d %H:%M")
return dt.replace(year=now.year)
except ValueError:
pass
return None return None
# ── 主入口 ───────────────────────────────────────────── # ── 主入口 ─────────────────────────────────────────────
@@ -386,7 +405,10 @@ class EmailVerifier:
# 检查时间 # 检查时间
if after_timestamp and msg.get("date"): if after_timestamp and msg.get("date"):
msg_dt = self._parse_rc_date(msg["date"]) msg_dt = self._parse_rc_date(msg["date"])
if msg_dt: if msg_dt is None:
# 日期无法解析的旧邮件(如完整时间戳),在有 after_timestamp 时跳过
logger.debug(f"Roundcube: 邮件 UID={msg['uid']} 日期 '{msg['date']}' 无法解析,已跳过")
continue
# Roundcube 日期只有分钟精度(如"今天 14:20"→14:20:00), # Roundcube 日期只有分钟精度(如"今天 14:20"→14:20:00),
# 而 after_timestamp 是秒级精度(如14:20:49)。 # 而 after_timestamp 是秒级精度(如14:20:49)。
# 直接比较会把同一分钟内的邮件误判为"早于发送时间"跳过。 # 直接比较会把同一分钟内的邮件误判为"早于发送时间"跳过。