diff --git a/app.py b/app.py index 9651046..99edf5b 100755 --- a/app.py +++ b/app.py @@ -4017,10 +4017,15 @@ def scheduled_task_worker(): # 每小时清理过期验证码 schedule.every().hour.do(cleanup_expired_captcha) + # 每天北京时间0点重置SMTP配额 + quota_reset_utc_time = cst_to_utc_time("00:00") + schedule.every().day.at(quota_reset_utc_time).do(email_service.reset_smtp_daily_quota) + # 只在首次运行时打印基础任务日志 if is_first_run: print(f"[定时任务] 已设置数据清理任务: 每天 CST 03:00 (UTC {cleanup_utc_time})") print(f"[定时任务] 已设置验证码清理任务: 每小时执行一次") + print(f"[定时任务] 已设置SMTP配额重置: 每天 CST 00:00 (UTC {quota_reset_utc_time})") # 如果启用了定时浏览任务,则添加 if config.get('schedule_enabled'): diff --git a/email_service.py b/email_service.py index 892de8a..4e2708f 100644 --- a/email_service.py +++ b/email_service.py @@ -933,6 +933,23 @@ def _update_email_stats(email_type: str, success: bool): conn.commit() +def reset_smtp_daily_quota(): + """重置所有SMTP配置的每日发送计数(北京时间凌晨0点调用)""" + today = get_beijing_today() + with db_pool.get_db() as conn: + cursor = conn.cursor() + cursor.execute(""" + UPDATE smtp_configs + SET daily_sent = 0, daily_reset_date = ? + WHERE daily_reset_date != ? OR daily_reset_date IS NULL OR daily_reset_date = '' + """, (today, today)) + updated = cursor.rowcount + conn.commit() + if updated > 0: + print(f"[邮件服务] 已重置 {updated} 个SMTP配置的每日配额") + return updated + + def get_email_stats() -> Dict[str, Any]: """获取邮件统计""" with db_pool.get_db() as conn: