关于筹建简易邮箱验证服务的一些想法
情境
server可以定时为用户推送一些资料,现在需要用户输入邮箱,经过验证后将其纳入发送列表以便向此邮箱提供服务。
没什么新颖的技术,事先也没有查阅相关资料,只是一些搭建简易验证流程的想法。
如果有更靠谱的或者更简单的也可以comment。
关于验证流程
邮箱地址有效性验证
这个问题应该困扰过很多人,一般情况下的解决方案是使用正则表达式去匹配邮箱格式。
但是我这种不精通Regex的人大概不想这么做,所以使用了最为暴力的方法:
Just send them an email already.
出自文章:Stop Validating Email Addresses With Regex,(义正言辞地偷懒,哈哈,毕竟最原始的方法才是最好用的,邮箱的各种奇葩合法格式很难匹配全吧,容易误伤。
这样就自然而然地引出了下面一个问题,我们需要给用户一个链接访问server,server验证此链接所带param的特征去激活这个邮箱。
通过链接激活相应邮箱
0x0 Hash
用一个专门存放待验证邮箱的数据库表。
首先用户填入了邮箱mail@example.com
,server计算其hash之后将其存入表中:
{
"mailbox": "mail@example.com",
"hash": "7DAF6C79D4802916D83F6266E24850AF"
}
向用户发送链接:
https://yourserver.com/api/v1/validate?hash=7DAF6C79D4802916D83F6266E24850AF
用户点击后,server用这个hash把待验证的email地址查出来,挪到服务列表里。
0x1 Encrypt -> Derypt (or Encode -> Decode)
这种方式就是不使用一个中间数据库表,直接用加密函数&密钥去加密邮箱地址,然后发给这个邮箱:
https://yourserver.com/api/v1/validate?secret=s7dz5rt3y1u6ijkl7mn8b9hgvj96frrnagpkfg93gs51
(以上密文是脸滚键盘生成的,仅供示例。
用户点击之后server再将密文用秘钥解密得到邮箱地址,将其加入服务列表。
关于验证时机
先验证,后服务
使用一些别的网站的时候,感觉大多数都是用的这种,毕竟使用邮箱注册的账号必须要求账号名有效,上面设想的两种流程也属于验证后再服务。
先服务,后验证
对于一些对邮箱地址有效性要求并不那么高的服务来说,比如订阅资讯等,不需要用户立即去验证邮箱就可立即提供一段时间的服务。
这样只需要一个表,在表中设置一个状态validated
即可,也便于用户退订服务的状态更改,如果用hash法,只需要直接新建:
{
"mailbox": "mail@example.com",
"hash": "7DAF6C79D4802916D83F6266E24850AF",
"validated": false
}
验证成功后再将validated
置true
。
加密解密(编码解码)的话就存:
{
"mailbox": "mail@example.com",
"validated": false
}
不过这样好像就跟不需要预先存邮箱地址的初衷冲突了,不过考虑到这种服务方式只需要一张表,也就没那么亏了。
那么超期仍未验证的邮箱怎么办呢,我们可以跑一个Batch定期检查,把逾期的记录从服务表中移除。
同样,先验证后服务的待验证列表也可以用这种方式移除逾期未验证的邮箱,但是加解密(编解码)的方式因为没有中间状态所以也没有办法判断是否逾期了。
如果想获得简单且更加灵活的验证方式也可以尝试组合本文中的各种流程。