Luogu-Contest-Reminder:更好的邮箱比赛提醒系统
洛谷上的比赛每隔几天就会更新一批,但是经常容易忘了记住具体时间。
有时候打开比赛列表,发现某场比赛“昨天晚上”就开了。
前面已经有人做过现成的邮件提醒服务,但它运行在别人的服务器上,不开源,还有广告(虽然没招到商),也不能自己配置。
(为什么我感觉我跟某些互联网公司一样,看到一个新玩意就自己做一个竞品)
于是我做了 Luogu Contest Reminder:一个可以自部署的洛谷比赛邮件提醒系统,基于 Python FastAPI + React,完全开源,没有广告。
(为什么我感觉我跟某些互联网公司一样,看到一个新玩意就自己做一个竞品)
GitHub ILoveScratch2/Luogu-Contest-Reminder
你可以直接前往 r.ilovescratch.us.ci 试用在线部署的版本,或者按照下面的说明自己部署。
功能概览
用户侧:
- 注册:填邮箱,然后输验证码和密码,标准三步
- 控制台:开关邮件提醒、查看未来 24 小时内的即将开始比赛列表、注销账号
- 可选是否在邮件中附上比赛题目描述:用 Mistune 把 Markdown 渲染为 HTML 嵌入邮件正文。关闭则只发比赛名称和时间,邮件更轻量。
管理员侧(首次启动时创建):
- 用户管理:查看全部用户、修改活跃状态 / 提醒开关 / 权限 / 重置密码、删除账户
- SMTP 配置:填写服务器信息,一键测试连接
- 手动触发:不用等到次日 08:00,立刻发一次提醒
- 灵活配置:设置调度器每天自动发送提醒的时间,包含比赛时间范围,发送邮件模板等。
- BCC 批量发送:调度器按“提醒的比赛集合 + 是否附题目描述”进行用户分组,同一组用密送(BCC)合并发送,减少 SMTP 请求次数。最大批次大小可在管理员面板配置,默认 100。
- 验证码:注册时的人机验证,目前只做了内置的 Pillow 图形验证码和 Cloudflare Turnstile 用来防止恶意注册。
调度器默认在每日北京时间 08:00 运行,向所有开启了提醒的活跃用户发送接下来 24 小时内开始的比赛通知,已发送过的比赛不会重复推送。
自部署
:::warning[前置要求]{open}
- Python 3.10+
- Node.js 18+(前端)
- 一个可用的 SMTP 邮箱(用于发送提醒邮件) :::
后端
git clone https://github.com/ILoveScratch2/Luogu-Contest-Reminder.git
cd Luogu-Contest-Reminder/backend
pip install -r requirements.txt
python main.py
首次运行会要求创建管理员账号(输入邮箱和密码,密码输入时不会在控制台显示),之后直接启动。
后端 API 默认监听 http://0.0.0.0:8000。数据库文件 lgcontest.db(SQLite)和密钥文件 secret.key 会在当前目录自动生成,注意要保护 secret.key 文件。
前端
cd ../frontend
npm install
npm run dev
访问 http://localhost:5173,用管理员账号登录,完成 SMTP 配置后就可以正常收发邮件了。
调试时前后端需要同时运行,如果你要部署,可以使用 npm run build 构建前端,然后将构建产物放在后端的 static 目录下,后端会自动提供前端服务。
SMTP 配置
进入管理员面板的“SMTP 配置”页面,填入以下信息:
| 字段 | 说明 |
|---|---|
| 服务器 | SMTP 主机地址 |
| 端口 | SMTP 端口 |
| 用户名 | 邮箱地址 |
| 密码 | 邮箱密码 |
| 发件人名称 | 显示在收件人侧的名字 |
:::warning[注意]{open} QQ 邮箱、163 邮箱等需要在邮箱设置中手动开启 SMTP 服务,并使用生成的授权码而非登录密码。 :::
如果你使用的是个人邮箱服务商提供的 SMTP,可以去 Mozilla ISPDB 查找对应的服务器配置。
填写后,可以用“测试连接”,测试 SMTP 配置。
License
本项目使用 AGPL-3.0 许可证。
如果你也曾错过过洛谷比赛,欢迎试试。有 Bug 或功能建议请在 GitHub Issues 提出。