A high-performance, cost-effective email validation service designed for indie hackers and small startups. The service validates email addresses in real-time, checking syntax, domain existence, MX records, and detecting disposable email providers.
🌐 Website: https://rapid-email-verifier.fly.dev/
🚀 API https://rapid-email-verifier.fly.dev/api/validate
This is a completely free and open source email validation API that never stores your data. Built to support solopreneurs and the developer community. Features include:
- Zero data storage - your emails are never saved!
- GDPR, CCPA, and PIPEDA compliant
- No authentication required
- No usage limits
- Quick response times
- Batch validation up to 100 emails
- ✅ Syntax validation
- 🌐 Domain existence check
- 📨 MX record validation
- 🚫 Disposable email detection
- 👥 Role-based email detection
- ✍️ Typo suggestions
- 📊 Real-time monitoring
- 🔄 Batch processing support
Note on Validation Approach: While email RFCs (5321, 5322) define extensive rules for valid email formats, many of these rules are not practically enforced by modern email servers. Our validation takes a practical approach, focusing on rules that are actually enforced by major email providers. For example, we don't support quoted strings in local parts (
"john doe"@example.com
) even though they're technically valid according to RFC, as they're rarely supported in practice and often cause issues.
// Standard email
{
"email": "[email protected]",
"validations": {
"syntax": true,
"domain_exists": true,
"mx_records": true
},
"status": "VALID"
}
// Email with plus addressing
{
"email": "[email protected]",
"validations": {
"syntax": true,
"domain_exists": true,
"mx_records": true
},
"status": "VALID"
}
// International email (Unicode)
{
"email": "用户@例子.广告",
"validations": {
"syntax": true,
"domain_exists": true,
"mx_records": true
},
"status": "VALID"
}
// Hindi characters
{
"email": "अजय@डाटा.भारत",
"validations": {
"syntax": true,
"domain_exists": true,
"mx_records": true
},
"status": "VALID"
}
// Missing @ symbol
{
"email": "invalid-email",
"validations": {
"syntax": false
},
"status": "INVALID_FORMAT"
}
// Double dots in local part
{
"email": "[email protected]",
"validations": {
"syntax": false
},
"status": "INVALID_FORMAT"
}
// Spaces in quotes (not supported)
{
"email": "\"john doe\"@example.com",
"validations": {
"syntax": false
},
"status": "INVALID_FORMAT"
}
// Multiple @ symbols
{
"email": "user@[email protected]",
"validations": {
"syntax": false
},
"status": "INVALID_FORMAT"
}
// Disposable email detection
{
"email": "[email protected]",
"validations": {
"syntax": true,
"domain_exists": true,
"mx_records": true,
"is_disposable": true
},
"status": "DISPOSABLE"
}
// Role-based email detection
{
"email": "[email protected]",
"validations": {
"syntax": true,
"domain_exists": true,
"mx_records": true,
"is_role_based": true
},
"status": "PROBABLY_VALID"
}
// Request
POST /api/validate/batch
{
"emails": [
"[email protected]",
"invalid-email",
"[email protected]",
"[email protected]"
]
}
// Response
{
"results": [
{
"email": "[email protected]",
"validations": {
"syntax": true,
"domain_exists": true,
"mx_records": true
},
"status": "VALID"
},
{
"email": "invalid-email",
"validations": {
"syntax": false
},
"status": "INVALID_FORMAT"
},
{
"email": "[email protected]",
"validations": {
"syntax": true,
"domain_exists": false
},
"status": "INVALID_DOMAIN"
},
{
"email": "[email protected]",
"validations": {
"syntax": true,
"domain_exists": true,
"mx_records": true,
"is_role_based": true
},
"status": "PROBABLY_VALID"
}
]
}
- Go 1.21+
- Redis (caching, only for domains, not email addresses)
- Prometheus (metrics)
- Grafana (monitoring)
- Docker & Docker Compose
- Go 1.21 or higher
- Docker and Docker Compose
- Git
- VSCode (recommended)
# Using Homebrew
brew install go
# Verify installation
go version # Should show go version 1.21 or higher
# Add Go repository
sudo add-apt-repository ppa:longsleep/golang-backports
sudo apt update
# Install Go
sudo apt install golang-go
# Verify installation
go version
- Download the installer from Go Downloads
- Run the installer
- Open Command Prompt and verify:
go version
Add these to your shell profile (~/.bashrc
, ~/.zshrc
, etc.):
# Go environment variables
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
Reload your shell or run:
source ~/.bashrc # or ~/.zshrc
- Download Docker Desktop for Mac
- Install and start Docker Desktop
- Verify installation:
docker --version
docker-compose --version
# Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Install Docker Compose
sudo apt install docker-compose
# Start Docker
sudo systemctl start docker
# Add your user to docker group (optional)
sudo usermod -aG docker $USER
# Verify installation
docker --version
docker-compose --version
- Download and install Docker Desktop for Windows
- Enable WSL 2 if prompted
- Start Docker Desktop
- Verify in Command Prompt:
docker --version
docker-compose --version
-
Install VSCode
- Download from Visual Studio Code
- Install for your platform
-
Install Required Extensions
# Essential Extensions - Go (by Go Team at Google) - Docker (by Microsoft) - GitLens (by GitKraken) - Remote Development (by Microsoft) # Recommended Extensions - Error Lens - Go Test Explorer - YAML - Markdown All in One
-
Configure Go Extension After installing the Go extension:
- Open Command Palette (Cmd/Ctrl + Shift + P)
- Type "Go: Install/Update Tools"
- Select all tools and click OK
This will install:
- gopls (Go language server)
- dlv (debugger)
- golangci-lint (linter)
- goimports (code formatter)
- and other essential Go tools
-
VSCode Settings Create or update
.vscode/settings.json
:{ "go.useLanguageServer": true, "go.lintTool": "golangci-lint", "go.lintFlags": ["--fast"], "editor.formatOnSave": true, "[go]": { "editor.defaultFormatter": "golang.go", "editor.codeActionsOnSave": { "source.organizeImports": true } } }
-
Debugging Setup Create
.vscode/launch.json
:{ "version": "0.2.0", "configurations": [ { "name": "Launch Email Validator", "type": "go", "request": "launch", "mode": "auto", "program": "${workspaceFolder}", "env": {}, "args": [] } ] }
# Install golangci-lint
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
# Install air for hot reload (optional)
go install github.com/cosmtrek/air@latest
# Install mockgen for testing
go install github.com/golang/mock/mockgen@latest
- Clone the Repository
git clone https://github.com/umuterturk/email-verifier.git
cd email-verifier
- Install Dependencies
go mod tidy
- Start Monitoring Stack
docker-compose up -d
- Build and Run the Service
go build
./emailvalidator
The service will be available at:
- API: http://localhost:8080
- Metrics: http://localhost:8080/metrics
- Grafana: http://localhost:3000 (admin/admin)
- Prometheus: http://localhost:9090
.
├── cmd/ # Command line tools
├── internal/
│ ├── api/ # HTTP handlers
│ ├── middleware/ # HTTP middleware components
│ ├── model/ # Data models
│ ├── repository/ # Data access layer
│ └── service/ # Business logic
├── pkg/
│ ├── validator/ # Email validation logic
│ ├── monitoring/ # Metrics and monitoring
│ └── cache/ # Caching implementation
├── test/ # Unit, integration and acceptnce tests
└── config/ # Configuration files
- Run All Tests (excluding load tests)
go test ./... -v -skip "Load"
- Run Tests with Race Detection
go test -race ./... -skip "Load"
Race detection is crucial for identifying potential data races in concurrent code. It's automatically run in CI/CD pipelines and should be run locally before submitting changes.
Common race conditions to watch for:
- Concurrent map access
- Shared variable access without proper synchronization
- Channel operations
- Goroutine lifecycle management
- Run Load Tests
go test ./test/load_test.go -v
- Run Linter
golangci-lint run
- Format Code
go fmt ./...
- Check for Common Mistakes
go vet ./...
The project uses GitHub Actions for CI/CD with the following checks:
- Unit tests with race detection
- Integration tests
- Acceptance tests
- Code linting
- Code formatting
- Security scanning
- Dependency updates
All these checks must pass before code can be merged into the main branch.
The project includes several types of tests:
# Run the comprehensive API test suite
./test_api.sh
The results provided by this service are based on best-effort validation and should be treated as recommendations rather than absolute truth. Several factors can affect the accuracy of results:
- Domain DNS records may change
- Temporary DNS resolution issues
- Network connectivity problems
- Email server configuration changes
- Rate limiting by email servers
- Syntax validation differences between email providers
This service is provided "as is" without any warranties or guarantees of any kind, either express or implied. The validation results are for informational purposes only and should not be considered legally binding or definitive. We expressly disclaim any liability for damages of any kind arising from the use of this service or its results. Users are solely responsible for verifying the accuracy of email addresses through additional means before using them for any purpose.