Search code examples
emailgmail

How to check an email address for existence programmatically on Gmail?


If you google "How to check an email address for existence" question, you will find, basically, only solutions using SMTP protocol what is not reliable. I tried this approach and found that Gmail SMTP server says "Yes, this email is registered here" on each and every email address I ask about. I suspect such strategy is used on the majority of popular email servers.


Solution

  • The method I would like to share is used in Gmail registration form to ensure you are going to register a brand new email. It uses AJAX request to ask Gmail server if given email exists or not

    Request URL:https://accounts.google.com/InputValidator?resource=SignUp
    Request Method:POST
    Status Code:200 
    Remote Address:173.194.222.84:443
    

    Response Headers

    alt-svc:quic=":443"; ma=2592000; v="37,36,35"
    cache-control:private, max-age=0
    content-encoding:gzip
    content-type:application/json; charset=utf-8
    date:Wed, 29 Mar 2017 21:06:06 GMT
    expires:Wed, 29 Mar 2017 21:06:06 GMT
    server:GSE
    set-cookie:GAPS=1:<redacted>;Path=/;Expires=Fri, 29-Mar-2019 21:06:06 GMT;Secure;HttpOnly;Priority=HIGH
    status:200
    strict-transport-security:max-age=10893354; includeSubDomains
    x-content-type-options:nosniff
    x-frame-options:DENY
    x-xss-protection:1; mode=block
    

    Request Headers

    Provisional headers are shown
    Content-type:application/json
    Origin:https://accounts.google.com
    Referer:https://accounts.google.com/SignUp?hl=en-GB
    User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
    

    Query String Parameters

    resource=SignUp
    

    Request Payload

    {"input01":{"Input":"GmailAddress","GmailAddress":"andy.v.che","FirstName":"","LastName":""},"Locale":"en-GB"}
    

    Response

    {"input01":{"Valid":"false","ErrorMessage":"Someone already has that username. Note that we ignore full stops and capitalisation in usernames. Try another?","Errors":{"GmailAddress":"Someone already has that username. Note that we ignore full stops and capitalisation in usernames. Try another?"},"ErrorData":["andyvche959"]},"Locale":"en_GB"}
    

    As you can see, there is "Valid":"false" in the response if such an email does exist, and (spoilers) "Valid":"true" if it doesn't.

    Throttling queries down

    Guys from Gmail do understand this method could be used by spammers to look for existing emails. That's why they don't allow massive scans using it. I was doing such a scan for some time and could scan only 200 emails a day approximately.

    More details

    I was scanning 1 email a minute, and if I was getting response "No, this email doesn't exist", I also asked if my own email exists. If I got "No, your email doesn't exist as well" answer, I could clearly understand that I got ban from Gmail server by my IP address. Then, I took a break for 45 minutes to get unbanned, then continued the loop. The number af emails scanned a day was fluctuating around 200.

    You may ask: you did a scan like a spammer would perform, for what purpose did you do that scan then?

    My answer is: I was trying to find a guy who wrote his email unclearly (bad cursive). There was no other option to find him.

    There were 3 unclear letters in his written email but it was clear the domain of it is gmail.com, so I came up with an idea to find a way to check an email address for existence on Gmail, generate a list of all possible emails (trying to substitute unknown symbols with all possible English letters) and check them all for existence. Then, send a letter to all existing ones.

    The right of this information to be published is discussed in this question. I understand this article will be very useful for spammers so I'm open to deleting it partially or even completely for the sake of security.