✉️ A Go library for email verification without sending any emails.
Use go get
to install this package.
go get -u github.com/AfterShip/email-verifier
Use Verify
method to verify an email address with different dimensions
package main
import (
"fmt"
emailverifier "github.com/AfterShip/email-verifier"
)
var (
verifier = emailverifier.NewVerifier()
)
func main() {
email := "example@exampledomain.org"
ret, err := verifier.Verify(email)
if err != nil {
fmt.Println("verify email address failed, error is: ", err)
return
}
if !ret.Syntax.Valid {
fmt.Println("email address syntax is invalid")
return
}
fmt.Println("email validation result", ret)
/*
result is:
{
"email":"example@exampledomain.org",
"disposable":false,
"reachable":"unknown",
"role_account":false,
"free":false,
"syntax":{
"username":"example",
"domain":"exampledomain.org",
"valid":true
},
"has_mx_records":true,
"smtp":null,
"gravatar":null
}
*/
}
Use CheckSMTP
to performs an email verification lookup via SMTP.
var (
verifier = emailverifier.
NewVerifier().
EnableSMTPCheck()
)
func main() {
domain := "domain.org"
username := "username"
ret, err := verifier.CheckSMTP(domain, username)
if err != nil {
fmt.Println("check smtp failed: ", err)
return
}
fmt.Println("smtp validation result: ", ret)
}
If you want to disable catchAll checking, use the DisableCatchAllCheck()
switch (in effect only when SMTP verification is enabled).
verifier = emailverifier.
NewVerifier().
EnableSMTPCheck().
DisableCatchAllCheck()
Note: because most of the ISPs block outgoing SMTP requests through port 25 to prevent email spamming, the module will not perform SMTP checking by default. You can initialize the verifier with
EnableSMTPCheck()
to enable such capability if port 25 is usable, or use a socks proxy to connect over SMTP
Support setting a SOCKS5 proxy to verify the email, proxyURI should be in the format: socks5://user:password@127.0.0.1:1080?timeout=5s
The protocol could be socks5, socks4 and socks4a.
var (
verifier = emailverifier.
NewVerifier().
EnableSMTPCheck().
Proxy("socks5://user:password@127.0.0.1:1080?timeout=5s")
)
func main() {
domain := "domain.org"
username := "username"
ret, err := verifier.CheckSMTP(domain, username)
if err != nil {
fmt.Println("check smtp failed: ", err)
return
}
fmt.Println("smtp validation result: ", ret)
}
To check if an email domain is disposable via IsDisposable
var (
verifier = emailverifier.
NewVerifier().
EnableAutoUpdateDisposable()
)
func main() {
domain := "domain.org"
if verifier.IsDisposable(domain) {
fmt.Printf("%s is a disposable domain\n", domain)
return
}
fmt.Printf("%s is not a disposable domain\n", domain)
}
Note: It is possible to automatically update the disposable domains daily by initializing verifier with
EnableAutoUpdateDisposable()
Will check for typos in an email domain in addition to evaluating its validity.
If we detect a possible typo, you will find a non-empty "suggestion" field in the validation result containing what we believe to be the correct domain.
Also, you can use the SuggestDomain()
method alone to check the domain for possible misspellings
func main() {
domain := "gmai.com"
suggestion := verifier.SuggestDomain(domain)
// suggestion should be `gmail.com`
if suggestion != "" {
fmt.Printf("domain %s is misspelled, right domain is %s. \n", domain, suggestion)
return
}
fmt.Printf("domain %s has no possible misspellings. \n", domain)
}
Note: When using the
Verify()
method, domain typo checking is not enabled by default, you can enable it in a verifier withEnableDomainSuggest()
For more detailed documentation, please check on godoc.org 👉 email-verifier
We provide a simple self-hosted API server script for reference.
The API interface is very simple. All you need to do is to send a GET request with the following URL.
The email
parameter would be the target email you want to verify.
https://{your_host}/v1/{email}/verification
email-verifier | trumail | check-if-email-exists | freemail | |
---|---|---|---|---|
Features | 〰️ | 〰️ | 〰️ | 〰️ |
Disposable email address validation | ✅ | ✅, but not available in free lib | ✅ | ✅ |
Disposable address autoupdate | ✅ | 🤔 | ❌ | ❌ |
Free email provider check | ✅ | ✅, but not available in free lib | ❌ | ✅ |
Role account validation | ✅ | ❌ | ✅ | ❌ |
Syntax validation | ✅ | ✅ | ✅ | ❌ |
Email reachability | ✅ | ✅ | ✅ | ❌ |
DNS records validation | ✅ | ✅ | ✅ | ❌ |
Email deliverability | ✅ | ✅ | ✅ | ❌ |
Mailbox disabled | ✅ | ✅ | ✅ | ❌ |
Full inbox | ✅ | ✅ | ✅ | ❌ |
Host exists | ✅ | ✅ | ✅ | ❌ |
Catch-all | ✅ | ✅ | ✅ | ❌ |
Gravatar | ✅ | ✅, but not available in free lib | ❌ | ❌ |
Typo check | ✅ | ✅, but not available in free lib | ❌ | ❌ |
Use proxy to connect over SMTP | ✅ | ❌ | ✅ | ❌ |
Honeyport dection | 🔜 | ❌ | ❌ | ❌ |
Bounce email check | 🔜 | ❌ | ❌ | ❌ |
Tech | 〰️ | 〰️ | 〰️ | 〰️ |
Provide API | ✅ | ✅ | ✅ | ❌ |
Free API | ✅ | ❌ | ❌ | ❌ |
Language | Go | Go | Rust | JavaScript |
Active maintain | ✅ | ❌ | ✅ | ✅ |
High Performance | ✅ | ❌ | ✅ | ✅ |
Most ISPs block outgoing SMTP requests through port 25 to prevent email spamming. email-verifier
needs to have this port open to make a connection to the email's SMTP server. With the port being blocked, it is not possible to perform such checking, and it will instead hang until timeout error. Unfortunately, there is no easy workaround for this issue.
For more information, you may also visit this StackOverflow thread.
"connection refused"
in the smtp.error
field.This error can also be due to SMTP ports being blocked by the ISP, see the above answer.
This means that the server does not allow real-time verification of an email right now, or the email provider is a catch-all email server.
For details on contributing to this repository, see the contributing guide.
This package is licensed under MIT license. See LICENSE for details.