Skip to main content

Email Safeguard

A comprehensive email validation library that provides domain suggestions, disposable email detection, and MX record validation with a focus on security and user experience.

PyPI version Python Versions License: MIT

Features

  • 🔍 Smart validation with helpful suggestions
  • 🛡️ Disposable email detection
  • 📨 MX record validation with configurable timeout handling
  • ⚡ Fast and customizable
  • 🎯 Type hints and modern Python support
  • 🔧 Configurable validation rules
  • 🔄 Automatic retry mechanism for DNS queries

Installation

pip install email-safeguard

Quick Start

from email_safeguard.validator import EmailSafeguard

validator = EmailSafeguard()
result = validator.validate("user@gmial.com")

if result.is_valid:
    if result.suggestions:
        print(f"Email is valid but did you mean: {result.suggestions.get('domain')}?")
    else:
        print("Email is valid!")
else:
    print(f"Error: {result.message}")

Advanced Usage

Custom Configuration

validator = EmailSafeguard(
    check_mx=True,              # Enable MX record validation
    allow_disposable=False,     # Reject disposable emails
    suggest_corrections=True,   # Suggest corrections for typos
    max_distance=2,            # Maximum edit distance for suggestions
    dns_timeout=3.0,          # DNS query timeout in seconds
    dns_retries=2,            # Number of retry attempts for DNS queries
    retry_delay=1.0          # Delay between retries in seconds
)

Timeout Handling

You can control how the validator handles MX record timeouts:

# Strict validation (timeouts treated as invalid)
result = validator.validate("example@domain.com", skip_mx_on_timeout=False)

# Lenient validation (timeouts treated as valid with warning)
result = validator.validate("example@domain.com", skip_mx_on_timeout=True)

if result.result == ValidationResult.TIMEOUT:
    print("DNS query timed out")

Handling Results

from email_safeguard.validator import EmailSafeguard, ValidationResult

validator = EmailSafeguard()
result = validator.validate("user@tempmail.com")

# Check the validation result
if result.result == ValidationResult.VALID:
    print("Email is valid!")
elif result.result == ValidationResult.DISPOSABLE:
    print("Disposable emails not allowed")
elif result.result == ValidationResult.INVALID_DOMAIN:
    if result.suggestions and 'domain' in result.suggestions:
        print(f"Invalid domain. Did you mean: {result.suggestions['domain']}?")
elif result.result == ValidationResult.NO_MX_RECORD:
    print("Domain has no mail server")
elif result.result == ValidationResult.TIMEOUT:
    print("MX record check timed out")

ValidationResult Types

The library provides several validation result types:

from email_safeguard.validator import ValidationResult

# Available validation results:
# ValidationResult.VALID          - Email is valid
# ValidationResult.INVALID_FORMAT - Email format is invalid
# ValidationResult.INVALID_DOMAIN - Domain is invalid
# ValidationResult.INVALID_TLD    - Top-level domain is invalid
# ValidationResult.DISPOSABLE     - Domain is a disposable email provider
# ValidationResult.NO_MX_RECORD   - Domain has no MX records
# ValidationResult.TIMEOUT        - MX record check timed out

Validation Response

The validate() method returns a ValidationResponse object with the following attributes:

class ValidationResponse:
    is_valid: bool              # Whether the email is valid
    result: ValidationResult    # The specific validation result
    message: str               # A descriptive message
    suggestions: Optional[Dict[str, str]]  # Suggested corrections if any

Performance Tuning

Adjust DNS query settings for your needs:

# For faster validation with less reliability
validator = EmailSafeguard(
    dns_timeout=1.0,    # Short timeout
    dns_retries=1,      # Single attempt
    retry_delay=0.5     # Short retry delay
)

# For more reliable validation
validator = EmailSafeguard(
    dns_timeout=5.0,    # Longer timeout
    dns_retries=3,      # More retries
    retry_delay=1.0     # Standard retry delay
)

Data Files

The library uses three customizable data files:

  • popular_domains.txt: Common email domains
  • popular_tlds.txt: Valid top-level domains
  • disposable_domains.txt: Known disposable email providers

Custom Data Files

validator = EmailSafeguard(data_dir="path/to/data/directory")

Development

Running Tests

# Run all tests
python -m pytest

# Run with coverage
python -m pytest --cov=email_safeguard

Type Checking

mypy email_safeguard

Contributing

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Author

Chukwuka Ibejih (chukaibejih@gmail.com)

Acknowledgements

Built with:


If you find this library helpful, please give it a ⭐!

Metadata

Release files for email-safeguard 0.1.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for email-safeguard 0.1.8
File Size Uploaded
email_safeguard-0.1.8.tar.gz 971.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for email-safeguard 0.1.8
File Interpreter ABI Platform
email_safeguard-0.1.8-py3-none-any.whl Python 3 none any Details

Total release size: 1.9 MB

Release files / email_safeguard-0.1.8.tar.gz

Download URL email_safeguard-0.1.8.tar.gz
Size 971.1 kB
Tags Source
SHA-256 checksum
How to use checksums
e2b4b8ce6b8c6b6522f732683196a2e0e43471a75210930a68dee19292ead8ab
BLAKE2b-256 checksum
How to use checksums
459bde1278fb9a3e38c40fa67dc844e9a9d681c4c543b6ad6fbfcb7996305d37
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.1 CPython/3.12.4

Release files / email_safeguard-0.1.8-py3-none-any.whl

Download URL email_safeguard-0.1.8-py3-none-any.whl
Size 969.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7c72232ad00119394121a5508d03b95d2f7d9ecc604164bd0fe39fae44ec7c15
BLAKE2b-256 checksum
How to use checksums
f3291cb6b64576d2e7b2aee419f6c70d4ef13e8967a5c7eb49f82fbcdf06a35a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.1 CPython/3.12.4

Release history Release notifications | RSS feed

This release

0.1.8 This release

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page