适用于 Typecho 的「新用户邮箱验证」插件。用户注册后自动生成一次性验证链接并通过 SMTP 发送邮件,在有效期内完成验证;未验证用户被管理员删除时自动发送提醒邮件。
这个插件开发的初衷是由于网站经常有很多不规则命名的邮箱注册用户,也不好判断是机器注册还是真人注册(毕竟有的用户会使用临时邮箱),加之我个人也不想用户注册的时候需要填写验证码或者先进行邮箱验证,所以有了这个先注册,后验证的插件。只要用户能在指定时间内访问邮件验证账户,则视为用户有效。
就邮箱验证、用户验证的插件来说,其实已经有很多现成的插件了,主要集中在注册的时候添加验证码或验证有效、评论验证码、登录验证码等,大家可自行探索。
功能特性
- 启用即迁移:启用插件时给
users表新增email_verified字段(默认 0),并将所有已有用户标记为已验证(置 1);此后新注册用户为未验证(0)。 - 注册钩子:注册完成后生成 64 位随机 token,写入独立表
user_cleaner_tokens(含 uid、token、创建时间、过期时间、状态)。 - SMTP 发信:通过插件自带的 SMTP 客户端发送验证邮件,链接有效期可在后台配置,默认 24 小时。
- 不阻断使用:验证期间用户可正常登录、评论、使用站点,不拦截任何流程。
- 一键验证:用户点击链接后,校验 token 有效性(未使用 / 未过期 / 用户存在),通过即将
email_verified置 1。 - 个人设置面板:在「控制台 → 个人设置」展示验证状态(绿色已验证 / 红色未验证),未验证时显示到期时间与「重新发送验证邮件」按钮。
- 后台用户管理:在「管理 → 用户」列表「用户组」列前新增「验证状态」列,直观显示每个用户的已验证 / 未验证状态。
- 删除提醒:管理员删除未验证用户时,自动向其邮箱发送提醒(内容为
<网站名称>提醒您:您因未在规定时间内完成邮件验证而被系统删除,下次使用,请重新注册。);已验证用户跳过。 - 注册后即时提醒:注册完成后在后台首页顶部弹出横幅提示「验证链接已发送至您的邮箱,请在规定时间内完成验证。」(邮件发送失败则提示前往个人设置重发)。
环境要求
| 项 | 要求 |
|---|---|
| Typecho | 1.2.1 及以上(含 1.3.0) |
| PHP | 7.4 及以上(已适配 8.4) |
| 数据库 | MySQL 8.0+ / PostgreSQL / SQLite(三方言自动适配) |
| PHP 扩展 | openssl、mbstring或iconv、json(Typecho 基础要求) |
本插件已通过 PHP 8.4 语法检查;SMTP 客户端使用fsockopen/stream_socket_enable_crypto实现,无需额外邮件扩展。
插件下载
github地址:https://github.com/tianlingzi/TypechoUserCleaner
本站下载:
该部分仅登录用户可见
安装
- 将
TypechoUserCleaner目录整体复制到站点usr/plugins/下。 - 登录后台,进入「控制台 → 插件」。
- 在「禁用的插件」列表找到 TypechoUserCleaner,点击「启用」。
- 启用后系统会自动执行数据库迁移(新增字段与建表),现有用户全部标记为已验证。
- 启用后请先点击「设置」填写 SMTP 配置,否则新用户注册时验证邮件会发送失败(不影响注册本身,会在后台弹出失败提示)。
配置项说明
进入「控制台 → 插件 → TypechoUserCleaner → 设置」:
| 配置项 | 默认值 | 说明 |
|---|---|---|
| SMTP 服务器地址 | — | 如smtp.qq.com、smtp.163.com、smtp.feishu.cn |
| SMTP 端口 | 465 | SSL 一般 465,TLS 一般 587,不加密 25 |
| 加密方式 | SSL | 可选 SSL / TLS / 不加密 |
| SMTP 用户名 | — | 通常与发件邮箱一致 |
| SMTP 密码 / 授权码 | — | QQ、163 等邮箱请填授权码而非登录密码 |
| 发件邮箱地址 | — | 留空则使用 SMTP 用户名 |
| 发件人名称 | — | 留空则使用网站名称 |
| 验证链接有效时间(小时) | 24 | 正整数 |
| 验证邮件标题 | 【{sitename}】请完成邮箱验证 | 可用变量{sitename} {username} {expire} |
| 验证邮件正文(HTML) | 内置模板 | 可用变量{sitename} {username} {link} {expire} |
使用流程
新用户注册
- 用户在前台或后台注册页完成注册。
- 注册成功后,系统自动生成 token 并发送验证邮件到用户邮箱。
- 后台首页顶部弹出提示横幅,告知用户验证链接已发送。
- 用户在有效期内点击邮件中的链接,即完成验证。
手动重发验证邮件
- 未验证用户登录后,进入「控制台 → 个人设置」,页面显示红色「邮箱未验证」徽章及当前链接到期时间,点击「重新发送验证邮件」即可。
- 重发会作废旧的 token,保证同一用户同时只有一个有效链接。
管理员视角
- 用户管理页:进入「管理 → 用户」,列表新增「验证状态」列,绿色「已验证」/ 红色「未验证」。
- 删除用户:选中未验证用户执行删除时,系统自动向其邮箱发送删除提醒邮件;已验证用户删除时不发信。最早注册的主用户与当前管理员账户受保护,不可删除(与 Typecho 核心逻辑一致)。
数据库变更
users 表
新增字段:
| 字段 | 类型 | 说明 |
|---|---|---|
email_verified | TINYINT / SMALLINT | 0 = 未验证,1 = 已验证;启用插件时已有用户全部置 1 |
user_cleaner_tokens 表(插件自建)
| 字段 | 类型 | 说明 |
|---|---|---|
id | 主键自增 | — |
uid | INT | 关联 users.uid |
token | CHAR(64) | 唯一索引,64 位十六进制 |
created | INT | 创建时间戳 |
expires | INT | 过期时间戳 |
status | TINYINT / SMALLINT | 0 = 未使用,1 = 已使用 |
卸载插件时会自动删除该表。
邮件链接地址
- 验证链接:
{站点首页}/action/tuc-user-cleaner?do=verify&token={token} - 重发链接:
{站点首页}/action/tuc-user-cleaner?do=resend(需登录,带 CSRF 校验)
链接通过 Typecho 的 Security::getIndex() 生成,兼容开启与未开启伪静态两种模式。
待考虑功能
到期自动删除用户?这个功能值得考虑,虽然可以使用用户登录触发、外置cron触发来弥补Typecho自动任务的缺陷,但是对系统安全的考虑来讲,还是将用户管理这个权限留给管理员合适,不对用户进行直接删除,以免误删。