之前介绍了通用的email校验方法,参考之前的文章 如何校验邮件地址是否存在? ,但是对于 Gmail 的邮件地址,我们可以使用如下的办法进行邮件校验。
这个方式源于一个被发现的接口,这个接口对于存在的Gmail地址和不存的Gmail 地址,有着不同的表现形式。而且这个接口还没有速率限制,那我们可以利用这个接口做很多事情。
方法介绍
这个网址为: https://mail.google.com/mail/gxlu,我们准备一个不存在的邮件地址:zijixiabiandeyouxiandizhi@gmail.com
$ curl -v https://mail.google.com/mail/gxlu?email=zijixiabiandeyouxiandizhi@gmail.com
# 我们只关心响应头和响应体
< HTTP/2 204
< cache-control: no-cache, no-store, max-age=0, must-revalidate
< pragma: no-cache
< expires: Mon, 01 Jan 1990 00:00:00 GMT
< date: Thu, 07 Mar 2019 09:32:07 GMT
< server: GSE
< alt-svc: clear
<
* Connection #0 to host mail.google.com left intact
然后我们换一个存在的邮箱地址:
$ curl -v https://mail.google.com/mail/gxlu?email=<yourgmail@gmail.com>
< HTTP/2 204
< cache-control: no-cache, no-store, max-age=0, must-revalidate
< pragma: no-cache
< expires: Mon, 01 Jan 1990 00:00:00 GMT
< date: Thu, 07 Mar 2019 09:42:23 GMT
< server: GSE
< set-cookie: COMPASS=gmail=Co0BAAlriVcz3ravdao-G4mTUT_pIPx5FwOFNrnav_3Yu1sW2_1_X3vif0dSUy1sJZQcz7elJuUX8Z6BTGRbUJmkf1ZLA2HcIKpSlRtoXXPjD_ZLO_JGv4FB7Y_ymx8Zk9RFlnEeJpZQ4FNzi_5jP_6ECot4EpSx0fj5McExyAjjYTU0UJ6nfzS08lNjBRJMEKHrg-QFGpYBAAlriVdP9vX9OY285idwTH4RhVGUeY1rxemZphohP-mnhJotsV8t5ltdTbPBT1tjn1xnabfQsmB79uSb737ymy4S_OvectoIyttxDDrRmcDqrI1TE5cVaK6ap6AHH26U2RezabIn5IhzfvVcj2s6VrB2szj9naduMz3mHZzhJtgzK8kRh_ARgQUvpopoKggLc81heg9R; expires=Sun, 17-Mar-2019 09:42:23 GMT; path=/mail; Secure; HttpOnly
< alt-svc: clear
<
* Connection #0 to host mail.google.com left intact
对比两个响应我们发现,该接口真实存在的邮箱会返回一个 set-cookie 响应头,而不存在的邮箱地址则不会有这个响应头,所以我们可以以此作为 Gmail 邮箱地址的校验方式。
Python 实现
使用 python 封装了一下,使用了 aiohttp 这个异步请求库,可以做到协程并发。代码如下:
import asyncio
import aiohttp
async def judge(email):
url = r"""https://mail.google.com/mail/gxlu?email="""+email
async with aiohttp.ClientSession() as client:
async with client.get(url) as resp:
if resp.headers.get('set-cookie', None) is not None:
return email
return None
def verify(emails: list)->list:
"""接受一个待验证的邮件列表
@return 返回所有通过验证的邮件
"""
loop = asyncio.get_event_loop()
tasks = []
for email in emails:
tasks.append(judge(email))
results = loop.run_until_complete(asyncio.gather(*tasks))
loop.close()
return results
if __name__ == "__main__":
emails = [
"""替换成你需要验证的邮件列表"""
]
print(verify(emails))
Github 地址:gmail_verify.py