之前介绍了通用的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

参考链接