password
status
date
icon
category
tags
slug
summary
0x00 前言
打算开发一款根据人名枚举企业邮箱的工具,简单的记录下踩的坑。
0x01 生成字典
采集了几万个人名,又从网上找了 top500 的人名,经过分析,发现人名拼音大致符合二八原则。百分之二十的拼音就已经覆盖了百分之八十的人名。
常用的姓拼音有 111 个,其中有 55 个占据了绝大部分(20 个大概占据了 80%+)
拼音一共 400+,常用的名拼音有 186 个,其中 79 个占据了绝大部分。
都取绝大部分,考虑到 2 个字和 3 个字的情况,共 55*79*80 = 347 600
这个数量勉强还在接受范围内。
0x02 准确率
一般验证邮箱是否存在都是连接邮件服务器然后发送一个请求,根据返回值来确认邮箱是否存在。
返回 250 或者 451 则邮箱存在,返回 550 则邮箱不存在
发现腾讯企业邮箱对于不存在的邮箱有时会返回 250,验证影响准确率,网上所有的开源检测工具据测试准确率只有 50%-60%左右,这个准确率完全无法接受。
发现网上的部分付费邮箱验证服务可以高概率判断邮箱是否存在,而开源的判断成功率都只有 50%多一点,故想搭建邮箱服务器偷一手付费邮箱验证服务的包,然后就是一大堆坑😭。
- 一开始是用的 fapro 搭的 smtp 服务,发现并因为它啥都返回 250,部分付费的会认为它是 Catch-all 邮箱。
- 后来搭建了真正的 smtp 服务,但是因为不清楚企业邮箱的过滤规则,没法还原出一样的场景,导致抓到的包并不好用。
- 终极方案:用 Python 写了个 tcp 转发脚本。逻辑如下
邮箱验证服务 - 我的邮箱服务器 - 将邮箱替换 - 转发到企业邮箱服务器
代码
通过终极方案,偷学了国内外十多家卖邮箱识别业务的技术,发现了好几种可以增加识别率的办法,我这里使用了两种:
- 随机且不同的
HELO
及MAIL FROM
- 250 后不断开立马再验证一个为不存在的邮箱,
- 多次验证
经过测试,对于准确率还可以,已经可用。
重复次数 3 次的时候准确率大概是97%
0x03 云函数
考虑到隐匿及封 ip 等问题,故考虑使用云函数进行发包。云函数正适合这种请求多,流量少的场景。因为
函数burst
的限制,一次调用云函数需要尽可能发送多个验证请求减少云函数并发。初步设想如下客户端异步请求云函数
云函数每分钟运行 300 - 400 次
在考虑到云函数内存有限的情况下每次尽可能多的验证邮箱,因为按次计费,不能一次只验证一个
注意:除了云函数执行时间拉满外别忘了 api 超时时间也拉满
云函数代码如下
传入邮箱服务器地址及需要验证的邮箱列表及需要调用的次数,进行验证后返回验证的结果。
0x04 客户端
我目前的策略是先统一验证 3 次再验证匹配到的 5 次,虽然按照我写的逻辑,这和直接验证 8 次请求量一样,但是发现有些时候短时间内对同一个邮箱验证太多次会触发风控,分成两批次验证,间隔时间比较长,经测试效果比直接 8 次好。
感觉算法还有非常多可以优化的地方,不过最近精力很差,就先这样吧,后续用到再改进。
使用时需要修改云函数 api 以及邮箱的格式,第三方库只有一个 httpx
- 作者:fatekey
- 链接:https://blog.fatekey.icu/article/mailTool
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章