mailgo is a Go CLI tool that verifies whether an email address is deliverable by running syntax checks and a live SMTP handshake — giving you a clear verdict before you send.
A friend of mine sends cold emails — a lot of them. He kept running into the same problem: a chunk of every list he built was dead weight — bad addresses, catch-all domains that silently swallow messages, and disposable inboxes that go nowhere. He was burning his sender reputation on addresses that were never going to convert.
I looked around for a simple tool he could run from the terminal before importing a list into his outreach tool. Everything I found was either a paid SaaS, a bloated library, or it only checked syntax. So I built mailgo: a single binary that does a real end-to-end check — SMTP handshake, catch-all detection, the works — and tells you exactly why an address is risky or undeliverable.
For every email address, mailgo runs a three-stage pipeline:
| Stage | Check | What It Catches |
|---|---|---|
| 1 | Syntax validation | Malformed addresses |
| 2 | SMTP handshake | Mailboxes that don't exist |
| 3 | Catch-all detection | Servers that accept everything (unreliable) |
Every address gets one of four verdicts: deliverable · undeliverable · risky · unknown
brew tap Hrid-a/mailgo
brew install mailgoscoop bucket add mailgo https://github.com/Hrid-a/scoop-mailgo.git
scoop install mailgocurl -fsSL https://raw.githubusercontent.com/Hrid-a/mailgo/master/install.sh | shnpm install -g @mailgo-cli/mailgogo install github.com/Hrid-a/mailgo@latestDownload the archive for your platform from the Releases page, extract it, and place the binary on your PATH.
mailgo verify user@example.com| Flag | Description |
|---|---|
--json |
Output results as JSON instead of plain text |
--output, -o |
Write results to a file (e.g. results.json) |
$ mailgo verify someone@company.com
Email : someone@company.com
Domain : company.com
Valid : true
Status : deliverable
Host Exists : true
Catch-All : false
Deliverable : true
Full Inbox : false
Disabled : false$ mailgo verify someone@company.com --json{
"email": "someone@company.com",
"domain": "company.com",
"valid": true,
"status": "deliverable",
"smtp": {
"host_exists": true,
"catch_all": false,
"deliverable": true,
"full_inbox": false,
"disabled": false
}
}Put one email per line in a .txt file, then:
$ mailgo verify --file emails.txt --output results.jsonResults are written to results.json, one JSON object per address.
| Verdict | Meaning |
|---|---|
deliverable |
Mailbox exists and should receive mail |
undeliverable |
Bad syntax or SMTP rejected the address |
risky |
SMTP connected but RCPT TO was rejected — may be anti-harvesting policy, not a dead address |
unknown |
Catch-all domain or SMTP unreachable — can't confirm either way |
git clone https://github.com/Hrid-a/mailgo.git
cd mailgogo build -o mailgo .go test ./...Fork the repository and open a pull request to the main branch. If you hit a mail server that produces a false positive or unexpected result, opening an issue with the domain (redacted if needed) is also very helpful.
MIT
