Guides
Last updated
July 20, 2025

5 Ways to Implement Email Validation in Python

Nicolas Rios
Nicolas Rios
Table of Contents:
ON THIS PAGE
Get your free
email validation
 API key now
stars rating
4.8 from 1,863 votes
See why the best developers build on Abstract
START FOR FREE
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
No credit card required

Validating email addresses is a key step for any Python application that handles user data. This guide presents five distinct methods for email validation, each with working code snippets. We'll examine the limitations of these approaches and show how Abstract API overcomes them for more reliable results.

How to Implement an Email Validator in Python

Python offers several ways to build an email validator. This section explores four different methods, from use of the standard library to a full mail server handshake.

Standard-Library Parsing

Python's core email package contains tools that implement the official specification for email syntax. The `email.headerregistry.Address` class, available in Python 3.6 and later, performs a full grammar parse of an address string.

This process normalizes the local part and the domain. The provided code defines a function that attempts this parse. It returns the normalized address upon success or raises a `ValueError` if the syntax is incorrect.

/cod

Regular Expression

A regular expression provides a lightweight, dependency-free check. While many simple patterns exist, a robust validator requires a complex expression that accurately follows the official email address specification.

The function compiles a regex pattern and uses the `fullmatch` method. This method checks if the entire email address string conforms to the pattern. If it matches, the function returns the address, otherwise it raises a `ValueError`.

import re

# A community-accepted RFC 5322 regex is used here.
# It is very long and has been omitted for brevity.
EMAIL_RX = re.compile(r"...")

def validate_addr_regex(addr: str) -> str:    
  if EMAIL_RX.fullmatch(addr):     
    return addr    
  raise ValueError("invalid address")

The email-validator Package

The email-validator package is a popular third-party library for Python. It performs syntax checks, punycode translation for international characters, and Unicode safety checks. It can also optionally check for domain deliverability.

The `validate_email` function returns a dataclass that contains normalized versions of the email. The library also provides specific exception types, such as `EmailSyntaxError`, which allows for more granular error handle.

from email_validator import validate_email, EmailNotValidError

def validate_addr_emailvalidator(addr: str, *, dns=True) -> str:
    v = validate_email(addr, check_deliverability=dns)
    return v.normalized      # canonical string for storage

MX Lookup and SMTP Handshake

This method determines if an address can likely receive mail. The process involves a network lookup to find the mail exchange (MX) records for the email's domain, as detailed in some validation articles.

After it finds the mail servers, the code connects to one and performs a partial SMTP handshake. It uses the `RCPT TO` command to ask the server if it accepts mail for the address, without actually send an email.

import dns.resolver, smtplib, socket

def validate_addr_mx(addr: str, timeout=3.0) -> str:
    local, domain = addr.rsplit('@', 1)
    try:
        mx_hosts = [r.exchange.to_text() for r in
                    dns.resolver.resolve(domain, 'MX')]
    except dns.exception.DNSException:
        raise ValueError("no MX")

    for host in sorted(mx_hosts, key=lambda h: h.preference):
        try:
            with smtplib.SMTP(host=str(host), timeout=timeout) as s:
                s.helo()
                code, _ = s.mail('validator@example.com')
                if code != 250:
                    continue
                code, _ = s.rcpt(addr)
                if code in (250, 251):
                    return addr       # accepted
        except (socket.error, smtplib.SMTPException):
            continue
    raise ValueError("undeliverable")

Challenges of Python Email Validation

While Python offers several validation methods, each presents unique implementation hurdles and limitations that developers must consider.

  • Regular expressions cannot fully parse RFC 5322's complex grammar, which includes comments and quoted strings. This limitation of the regex method leads to either overly complex patterns or false positives for valid, edge-case addresses.
  • Modern addresses use Unicode and international characters. Proper validation requires complex normalization and punycode conversions. Many custom solutions or simple libraries fail to handle these steps correctly, which causes validation mismatches for international users.
  • Deliverability checks, like the MX lookup and SMTP handshake method, depend on network requests. These lookups introduce latency and can fail due to slow DNS resolvers or poor connectivity, which makes validation unreliable under certain network conditions.
  • Many validators, including the email-validator package, use opinionated rules that reject obscure but valid syntax. They may also incorrectly flag domains without MX records as invalid, which creates false negatives for a small percentage of legitimate email addresses.

Validate Emails with Abstract API.
Validate email addresses using Python to protect your sender reputation and improve deliverability rates.
Get started for free

How Abstract API Handles Email Validation in Python

Abstract API addresses the core weaknesses of traditional methods through a dedicated service that handles the complex validation checks local methods miss.

  • It performs RFC-compliant syntax analysis.
  • The service conducts real-time MX record and SMTP handshake tests to confirm an email address can receive mail.
  • It detects disposable, free, catch-all, and role-based email providers.
  • A machine learning model assigns a quality score to grade the risk of each email address.
  • The Python SDK returns a structured data object with fields like deliverability and quality_score to inform application logic.

How to Add Abstract API to Your Dev Environment

Once you understand Abstract’s capabilities, the addition of its email validator API to your project is simple. First, install the SDK with pip.

pip install abstract-python-email-validation

Then, follow these steps to prepare your application:

  • Create an account with Abstract API to get your unique API key.
  • Store this key securely, for example, as an environment variable.
  • Import the AbstractEmailValidation class into your application.
  • Configure the class with your key to complete the setup.

The configuration code in your application will look like this:

from python_email_validation import AbstractEmailValidation
import os

# Configure the library with your API key from an environment variable
API_KEY = os.getenv("ABSTRACT_EMAIL_KEY") 
AbstractEmailValidation.configure(API_KEY)

Sample Email Validator Implementation with Abstract API

After the initial setup, you can validate any email address with a single method call. The code below sends an email address to the API and prints the structured response object. This object contains detailed flags and a score for you to build application logic.

from python_email_validation import AbstractEmailValidation

API_KEY = "YOUR_ABSTRACT_KEY"
AbstractEmailValidation.configure(API_KEY)

validation = AbstractEmailValidation.verify("jane.doe@gmail.com")
print(validation.deliverability, validation.quality_score)

The method returns a data object with a complete analysis. Here is a sample response for the disposable email address used above:

{
  "email":"mike.smith@yopmail.com",
  "auto_correct":"",
  "deliverability":"DELIVERABLE",
  "quality_score":0.33,
  "is_valid_format":true,
  "is_free_email":false,
  "is_disposable_email":true,
  "is_role_email":false,
  "is_catchall_email":false,
  "is_mx_found":true,
  "is_smtp_valid":true
}

The response shows the address is syntactically valid and the domain accepts mail, as `is_mx_found` and `is_smtp_valid` are both true. However, the API also identifies it as a disposable provider, so the `quality_score` is low. The `deliverability` status of DELIVERABLE lets your system decide whether to accept, throttle, or deny the user.

Final Thoughts

Traditional email validation with regex often fails. It cannot check deliverability, confirm mail server existence, or detect disposable domains. This creates gaps in data quality. Abstract API provides a robust alternative that performs these complex checks in a single call. To reliably validate user emails, consider an account on Abstract API to get your free API key.

Validate Emails with Abstract API
Build a Python email validator to improve your data quality and reduce bounced emails.
Get started for free

Related Articles

Phone Validation
key now
Get your free
stars rating
4.8 from 1,863 votes
See why the best developers build on Abstract
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
No credit card required