当前位置: 首页 > news >正文

Halo邮箱验证:注册即发验证码,把假邮箱挡在门外

Halo邮箱验证:注册即发验证码,把假邮箱挡在门外

【免费下载链接】haloHalo 是一款强大易用的开源建站工具,从个人博客、知识库,到企业官网、在线商城,Halo 都能助您轻松实现,一站式满足您的多样化建站需求。项目地址: https://gitcode.com/GitHub_Trending/ha/halo

给 Halo 装上邮箱验证(Email Verification),注册和改邮箱时都要输对 6 位验证码,证明你确实拥有这个邮箱。配完之后,密码重置、评论通知这些邮件才有了可靠的去处。

配好邮件渠道:SMTP地址、端口、授权码

Halo 的验证邮件由通知中心发出(简单说,通知中心负责决定"消息往哪个渠道送"),邮件渠道则依赖 SMTP——发信邮局,参数要向你的邮箱服务商要。

后台入口:管理后台 → 系统设置 → 通知设置 → 邮件渠道。这里没有邮件选项?先装插件。邮件渠道由"邮件通知"插件提供,去 设置 → 插件 列表里找到它装上,再回通知设置就能看到 SMTP 表单。

端口选 465 还是 587

两个都对,看服务商支持:465 走 SSL(加密从建立连接就开始),587 走 TLS(先明文后升级加密)。填错了的典型症状是保存时连接超时,以你邮箱服务商的说明为准。

授权码和登录密码不是一回事

⚠️ 表单里的"密码"栏填的不是账号密码。QQ 邮箱、163 邮箱都在"设置 → 账户安全"里单独生成一串授权码(也叫客户端授权码),填登录密码大概率连接失败。

邮件渠道定义、通知设置页源码

自定义验证邮件模板

默认模板是中文的,大致是"XX 你好:使用下面的动态验证码(OTP)验证您的电子邮件地址……验证码有效期 10 分钟"。想改称呼、改语气,用模板变量。

模板里能用的三个变量

username(收信人用户名)、code(6 位验证码)、expirationAtMinutes(有效期分钟数)。默认模板定义在 notification-templates.yaml 里,界面找不到编辑入口时,直接看这个文件。

走一遍完整验证:注册和改邮箱

新用户:注册即验证

打开注册页,填用户名、邮箱、密码提交。系统立刻往邮箱发验证码,页面提示输入 6 位数字。输对之后,用户资料里的emailVerified才置为 true,注册才算真正完成。

老用户:改邮箱要重新验证

登录用户中心修改邮箱后,原邮箱的验证状态作废,页面会要求对新邮箱重新收码验证。这也是防"改邮箱劫持"的关键设计:谁收到新邮箱的验证码,谁才算拥有它。

✅ 输对验证码后,邮箱旁会显示已验证状态,这条链路就通了。

验证码的规矩:10分钟、5次、1小时

📌 这套限制写在 EmailVerificationServiceImpl 里,共三条:

  • 有效期 10 分钟:验证码写入缓存后 10 分钟自动清除,源码里就一行expireAfterWrite(CODE_EXPIRATION_MINUTES, TimeUnit.MINUTES)
  • 同一验证码最多试 5 次:错满 5 次,该邮箱进入黑名单,1 小时内不能再验证
  • 重发频率:两次发送验证邮件的间隔不小于 1 分钟,防止有人刷邮件

想调整这些数值?默认值通常够用,具体改法以官方文档为准:邮箱验证设计文档

收不到验证邮件?三种情况

  • 现象:点"发送验证码",收件箱和垃圾箱都没有。根因:SMTP 认证失败或端口不通,邮件根本没发出去。操作:回通知设置核对 SMTP 账号、授权码、端口,先测试连接;再看服务器日志有没有出站报错。
  • 现象:提示"验证码无效或已过期"。根因:验证码 10 分钟作废,且只对"当前请求验证的那个邮箱"有效,换过邮箱后用旧邮件的码必错。操作:点重发,10 分钟内把新码输完。
  • 现象:提示"操作过于频繁"。根因:距上次发送不足 1 分钟,或 10 分钟内错满 5 次被临时拉黑。操作:等 1 分钟或 1 小时后再试。

到这里邮箱验证闭环了。下一步建议把"找回密码"的邮件渠道也走一遍测试——它和验证邮件走的是同一个通知中心,配好一次,两个功能都通。

【免费下载链接】haloHalo 是一款强大易用的开源建站工具,从个人博客、知识库,到企业官网、在线商城,Halo 都能助您轻松实现,一站式满足您的多样化建站需求。项目地址: https://gitcode.com/GitHub_Trending/ha/halo

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.cnnetsun.cn/news/4350074.html

相关文章:

  • IP地址与二进制转换全解析:从手算方法到Python实现
  • 为什么DNSHE免费DNS解析这么快?Anycast DNS技术原理深度剖析
  • 从零搭建RAG知识库问答系统:原理、代码与工程落地
  • Frigate 完整安装教程:30 分钟部署本地监控 AI NVR 与实时对象检测
  • 用Jetpack Compose从零实现安卓计时器:状态驱动UI与协程实战
  • AI搜索,你的企业还在“隐形”?北京GEO优化公司推荐,这三家助你提升可见度
  • CCR 配置备份与恢复的完整实战笔记
  • 如何为pm-skills贡献一个新技能?完整开发流程与验证脚本使用指南
  • 手术场景视觉-轨迹联合预测模型:从原理到工程部署
  • iFixAi新手完整教程:从干净机器到可引用审计报告只需4步
  • 基于Java+SpringBoot的船舶物料供应商交易平台的设计与实现(毕业设计项目源码+文档)
  • FreeRTOS 中优先级反转的解决方案-互斥量
  • Monorepo中管理多个DESIGN.md:多设计系统并行的完整指南
  • AI视频转场不靠运气:用Skill固化创作流程
  • 轮腿机器人离板面加速:5cm技术鸿沟的动力学原理与仿真实现
  • Abaqus热力耦合断裂仿真:UMAT/VUMAT子程序开发与工程实践
  • 如何用Feynman的rank命令给论文排优先级:PaperRank基于引用与复现证据的科学评分完整指南
  • Humanizer-zh 去 AI 痕迹实战 4 场景:营销文案、学术摘要、博客文章改写前后完整对比
  • 区块链智能合约详解:从原理到可运行Solidity源码实战
  • Hallmark Hero 标题长度与字号钳制关系:4 档自动降档规则完整指南
  • Java校招面试复盘:从基础八股到工程化实战
  • 给AI装上长期记忆:ZeroClaw记忆系统(SQLite+嵌入向量)完整配置攻略
  • AI Agent从入门到落地:概念、工具调用与日志分析实战
  • 内容泄露如何溯源?从权限控制到水印取证的完整技术指南
  • 香橙派5安装Windows ARM全流程:UEFI与ACPI配置必备指南
  • PDFMathTranslate 完整使用指南:如何在本地快速完成 PDF 科学文档翻译
  • next-ai-draw-io:一句话画出专业架构图,自然语言 draw.io 完整上手指南
  • OpenVoice 语音克隆:3秒参考音频如何做到跨语言音色迁移与风格自由控制
  • 如何从零搭建PDF翻译网页服务:PDFMathTranslate部署与公网访问配置指南
  • 用双色球历史数据练手:Excel与MySQL数据处理全流程实战