Skip to main content

A Python package to verify email addresses using SMTP, DNS, and web auth checks

Project description

Снимок

Email Multi Check

A Python package for verifying email addresses using DNS MX record checks, SMTP methods (RCPT, VRFY, EXPN, MAIL FROM / RCPT TO with RSET), and web-based authentication checks for specific providers like mail.ru.

Description

This package provides functions to validate email syntax, check domain MX records, and verify email existence using multiple SMTP methods or web API calls. It is designed for reliability across different email providers, with configurable web verification for domains like mail.ru.

Key features:

  • Syntax validation using a RFC 5322-compliant regex.
RegExp diagram:

No Punycode support

Без названия (1)
- DNS MX record verification with IDNA support. - SMTP verification using four methods: RCPT, VRFY, EXPN, and MAIL FROM / RCPT TO. - Web-based verification for configured domains, using external configuration files for URLs and request parameters. - Example Command-line testing script (`test_dns_smtp.py`) with customizable modes and ports. - Easy integration with FastAPI for REST API endpoints returning JSON responses.

Installation

Install the package via pip from the wheel file or source:

pip install email-multi-check

Or from source:

pip install .\dist\email_multi_check-1.0.7-py3-none-any.whl

Dependencies

  • dnspython >= 2.8.0
  • pydantic >= 2.11.10
  • idna >= 3.10
  • requests >= 2.32.5

Install them with:

pip install -r requirements.txt

Usage

Direct Function Calls

Import and use the functions directly in your Python code.

Example for full verification: (You can control which mailbox the request will be sent from.)

from email_multi_check import verify_email

# Full verification using all methods on specified ports
results = verify_email(
    email="test@gmail.com",
    sender_email="info@filterdns.net",
    ports=[25, 587]
)
for result in results:
    print(result)

Example for syntax verification: (Uses an improved email regular expression pattern (improved to be more RFC 5322 compliant))

from email_multi_check import verify_email_syntax

# Syntax verification
result = verify_email_syntax("test@gmail.com")
if result:
    print(result)
else:
    print("Valid syntax")

Example for domain verification: (Checking for IDNA encoding errors for a domain and checking the MX records)

from email_multi_check import verify_email_domain

# Domain verification
valid, mx_servers = verify_email_domain("test@gmail.com")
print({"valid": valid, "mx_servers": mx_servers})

Example for web-based verification (requires url.cfg): (Verify email existence via web API specified)

from email_multi_check import verify_email_web_auth

# Web-based verification
result = verify_email_web_auth("test@mail.ru")
print(result)

Command-Line Testing with test_dns_smtp.py

The package includes a test script test_dns_smtp.py for command-line verification.

Usage:

python test_dns_smtp.py -c <email> [-e <sender_email>] [-p <ports>] [-m <mode>]

Parameters:

  • -c, --check-email: Email address to check (required, e.g., test@gmail.com).
  • -e, --sender-email: Sender email address (default: info@filterdns.net).
  • -p, --ports: Comma-separated SMTP ports (default: 25,2525,587,465).
  • -m, --mode: Verification mode (default: all). Options: rcpt, vrfy, expn, mf, web, all.

use your existing email address to send

Detailed examples for all iterations (combinations of modes and ports):

  1. All modes on default ports:
   python test_dns_smtp.py -c test@gmail.com -e info@filterdns.net -m all
  1. All modes on port 25:
   python test_dns_smtp.py -c test@gmail.com -e info@filterdns.net -p 25 -m all
  1. RCPT mode on ports 25 and 587:
   python test_dns_smtp.py -c test@gmail.com -e info@filterdns.net -p 25,587 -m rcpt
  1. RCPT mode without sender email (uses default=info@filterdns.net):
    python test_dns_smtp.py -c test@gmail.com -p 25 -m rcpt
  1. VRFY mode on port 25:
   python test_dns_smtp.py -c test@gmail.com -e info@filterdns.net -p 25 -m vrfy
  1. EXPN mode on ports 25,587:
   python test_dns_smtp.py -c test@gmail.com -e info@filterdns.net -p 25,587 -m expn
  1. MF mode on port 465:
   python test_dns_smtp.py -c test@gmail.com -e info@filterdns.net -p 465 -m mf
  1. Web mode (no ports needed, requires url.cfg):
   python test_dns_smtp.py -c test@mail.ru -e info@filterdns.net -m web
Example out True:
    INFO:__main__:MX records for mail.ru: ['mxs.mail.ru.']
    INFO:__main__:Email verification (web): email=support@mail.ru, message=Valid email, status=True, MX=[], data=Web auth response: exists=True
    system_id='1.0.6' email='support@mail.ru' message='Valid email' status=True MX=[] smtplib_code=None method_code=None method='web' web_auth_code=None data='Web auth response: exists=True'
Example out False:
    INFO:__main__:MX records for mail.ru: ['mxs.mail.ru.']
    INFO:__main__:Email verification (web): email=6tgfjkl@mail.ru, message=No such user!, status=False, MX=[], data=Web auth response: exists=False, alternatives=['6tgfjkl@bk.ru', '6tgfjkl00@mail.ru', '6tgfjkl@inbox.ru', '6tgfjkl2025@mail.ru',        '6tgfjkl@list.ru', '6tgfjkl2026@mail.ru', '6tgfjkl@internet.ru', '6tgfjkl.00@mail.ru']
    system_id='1.0.6' email='6tgfjkl@mail.ru' message='No such user!' status=False MX=[] smtplib_code=None method_code=None method='web' web_auth_code=100 data="Web auth response: exists=False, alternatives=['6tgfjkl@bk.ru', '6tgfjkl00@mail.ru',     '6tgfjkl@inbox.ru', '6tgfjkl2025@mail.ru', '6tgfjkl@list.ru', '6tgfjkl2026@mail.ru', '6tgfjkl@internet.ru', '6tgfjkl.00@mail.ru']"

REST API with FastAPI

You can integrate the package with FastAPI to create a REST API for email verification. Responses are structured as JSON using Pydantic.

Example script (`test_api.py`): (The code is structured in such a way for better understanding)
  python --version
  Python 3.11.9
  pip install fastapi==0.118.0 uvicorn==0.37.0
from fastapi import FastAPI
from email_multi_check import verify_email, verify_email_syntax, verify_email_domain, verify_email_web_auth, verify_email_rcpt, verify_email_vrfy, verify_email_expn, verify_email_mail_from

app = FastAPI(title="Email Multi Check API")

@app.get("/verify")
async def verify_email_endpoint(email: str, sender_email: str = "info@filterdns.net", ports: str = "25,2525,587,465"):
    """Verify an email address using all methods in email_multi_check."""
    port_list = [int(p.strip()) for p in ports.split(",")]
    results = verify_email(email, sender_email, port_list)
    return [result.model_dump() for result in results]

@app.get("/verify/syntax")
async def verify_email_syntax_endpoint(email: str):
    """Verify email syntax using regex."""
    result = verify_email_syntax(email)
    return result.model_dump() if result else {"message": "Valid syntax", "status": True}

@app.get("/verify/domain")
async def verify_email_domain_endpoint(email: str):
    """Verify email domain by checking MX records."""
    valid, mx_servers = verify_email_domain(email)
    return {"valid": valid, "mx_servers": mx_servers}

@app.get("/verify/web")
async def verify_email_web_auth_endpoint(email: str):
    """Verify email existence via web API for supported domains."""
    result = verify_email_web_auth(email)
    return result.model_dump()

@app.get("/verify/rcpt")
async def verify_email_rcpt_endpoint(email: str, sender_email: str = "info@filterdns.net", port: int = 25):
    """Verify email using RCPT method."""
    valid, mx_servers = verify_email_domain(email)
    if not valid:
        return {"message": "Invalid domain", "status": False}
    result = verify_email_rcpt(email, sender_email, mx_servers, port)
    return result.model_dump()

@app.get("/verify/vrfy")
async def verify_email_vrfy_endpoint(email: str, sender_email: str = "info@filterdns.net", port: int = 25):
    """Verify email using VRFY method."""
    valid, mx_servers = verify_email_domain(email)
    if not valid:
        return {"message": "Invalid domain", "status": False}
    result = verify_email_vrfy(email, sender_email, mx_servers, port)
    return result.model_dump()

@app.get("/verify/expn")
async def verify_email_expn_endpoint(email: str, sender_email: str = "info@filterdns.net", port: int = 25):
    """Verify email using EXPN method."""
    valid, mx_servers = verify_email_domain(email)
    if not valid:
        return {"message": "Invalid domain", "status": False}
    result = verify_email_expn(email, sender_email, mx_servers, port)
    return result.model_dump()

@app.get("/verify/mf")
async def verify_email_mail_from_endpoint(email: str, sender_email: str = "info@filterdns.net", port: int = 25):
    """Verify email using MAIL FROM / RCPT TO method."""
    valid, mx_servers = verify_email_domain(email)
    if not valid:
        return {"message": "Invalid domain", "status": False}
    result = verify_email_mail_from(email, sender_email, mx_servers, port)
    return result.model_dump()

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

Run the API:

python test_api.py

Detailed Example Requests with curl

  1. Full verification using all methods on default ports:

Please note that without additional port and request type parameters, a cycle with a timeout of 15 seconds per iteration will be launched.

Example Curl:
curl -X 'GET' \
  'http://127.0.0.1:8000/verify?email=test%40gmail.com&sender_email=info%40filterdns.net&ports=25%2C2525%2C587%2C465' \
  -H 'accept: application/json'
Example Out:
[
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "No such user!",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": 250,
    "method_code": 550,
    "method": "rcpt",
    "web_auth_code": null,
    "data": "RCPT code: 550, port: 25"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP error: 2.1.5 Send some mail, I'll try my best 2adb3069b0e04-591def4a7d0si1680162e87.486 - gsmtp",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": 250,
    "method_code": 252,
    "method": "vrfy",
    "web_auth_code": null,
    "data": "VRFY code: 252, port: 25"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP error: 5.5.1 Unimplemented command. For more information, go to\n5.5.1  https://support.google.com/a/answer/3221692 2adb3069b0e04-591deebbcecsi1639517e87.93 - gsmtp",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": 250,
    "method_code": 502,
    "method": "expn",
    "web_auth_code": null,
    "data": "EXPN code: 502, port: 25"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "No such user!",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": 250,
    "method_code": 550,
    "method": "mf",
    "web_auth_code": null,
    "data": "MAIL/RCPT code: 550, port: 25"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "RCPT error: timed out, port: 2525"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "VRFY error: timed out, port: 2525"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "EXPN error: timed out, port: 2525"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "MAIL/RCPT error: timed out, port: 2525"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "RCPT error: timed out, port: 587"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "VRFY error: timed out, port: 587"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "EXPN error: timed out, port: 587"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "MAIL/RCPT error: timed out, port: 587"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "RCPT error: timed out, port: 465"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "VRFY error: timed out, port: 465"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "EXPN error: timed out, port: 465"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "MAIL/RCPT error: timed out, port: 465"
  }
]
  1. Full verification with custom ports (25,587):
Example Curl:
  curl -X 'GET' \
    'http://127.0.0.1:8000/verify?email=test%40gmail.com&sender_email=info%40filterdns.net&ports=25%2C587' \
    -H 'accept: application/json'
Example Out:
   [
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "No such user!",
    "status": false,
    "MX": [
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com.",
      "gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": 250,
    "method_code": 550,
    "method": "rcpt",
    "web_auth_code": null,
    "data": "RCPT code: 550, port: 25"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP error: 2.1.5 Send some mail, I'll try my best d2e1a72fcca58-7a22ff1978bsi4305243b3a.44 - gsmtp",
    "status": false,
    "MX": [
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com.",
      "gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": 250,
    "method_code": 252,
    "method": "vrfy",
    "web_auth_code": null,
    "data": "VRFY code: 252, port: 25"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP error: 5.5.1 Unimplemented command. For more information, go to\n5.5.1  https://support.google.com/a/answer/3221692 d9443c01a7336-29247238fd9si45057255ad.736 - gsmtp",
    "status": false,
    "MX": [
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com.",
      "gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": 250,
    "method_code": 502,
    "method": "expn",
    "web_auth_code": null,
    "data": "EXPN code: 502, port: 25"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "No such user!",
    "status": false,
    "MX": [
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com.",
      "gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": 250,
    "method_code": 550,
    "method": "mf",
    "web_auth_code": null,
    "data": "MAIL/RCPT code: 550, port: 25"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com.",
      "gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "RCPT error: timed out, port: 587"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com.",
      "gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "VRFY error: timed out, port: 587"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com.",
      "gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "EXPN error: timed out, port: 587"
  },
  {
    "system_id": "1.0.7",
    "email": "test@gmail.com",
    "message": "SMTP connection failed",
    "status": false,
    "MX": [
      "alt4.gmail-smtp-in.l.google.com.",
      "alt2.gmail-smtp-in.l.google.com.",
      "alt3.gmail-smtp-in.l.google.com.",
      "alt1.gmail-smtp-in.l.google.com.",
      "gmail-smtp-in.l.google.com."
    ],
    "smtplib_code": null,
    "method_code": null,
    "method": null,
    "web_auth_code": null,
    "data": "MAIL/RCPT error: timed out, port: 587"
  }
]
  1. Syntax verification (valid email):
Example Curl:
   curl -X 'GET' \
  'http://127.0.0.1:8000/verify/syntax?email=test%40gmail.com' \
  -H 'accept: application/json'
Example Out True:
{
  "message": "Valid syntax",
  "status": true
}
Example Out False:
 {
  "system_id": "1.0.7",
  "email": "invalid@",
  "message": "Bad Syntax",
  "status": false,
  "MX": [],
  "smtplib_code": null,
  "method_code": null,
  "method": null,
  "web_auth_code": null,
  "data": "Email does not match required pattern"
}
  1. Domain verification (MX records):
Example Curl:
  curl -X 'GET' \
    'http://127.0.0.1:8000/verify/domain?email=test%40gmail.com' \
    -H 'accept: application/json'
Example True:
{
  "valid": true,
  "mx_servers": [
    "gmail-smtp-in.l.google.com.",
    "alt3.gmail-smtp-in.l.google.com.",
    "alt4.gmail-smtp-in.l.google.com.",
    "alt2.gmail-smtp-in.l.google.com.",
    "alt1.gmail-smtp-in.l.google.com."
  ]
}
Example False:
{
  "valid": false,
  "mx_servers": []
}
  1. Web verification (for mail.ru):
Example Curl:
   curl -X 'GET' \
  'http://127.0.0.1:8000/verify/web?email=nonexistent123456%40mail.ru' \
  -H 'accept: application/json'
Example False:
{
  "system_id": "1.0.7",
  "email": "nonexistent123456@mail.ru",
  "message": "No such user!",
  "status": false,
  "MX": [],
  "smtplib_code": null,
  "method_code": null,
  "method": "web",
  "web_auth_code": 100,
  "data": "Web auth response: exists=False, alternatives=['nonexistent123456@bk.ru', 'nonexistent123456@inbox.ru', 'nonexistent123456@list.ru', 'nonexistent123456@internet.ru']"
}
Example True:
{
  "system_id": "1.0.7",
  "email": "support@mail.ru",
  "message": "Valid email",
  "status": true,
  "MX": [],
  "smtplib_code": null,
  "method_code": null,
  "method": "web",
  "web_auth_code": null,
  "data": "Web auth response: exists=True"
}
  1. RCPT method on port 25:
Example Curl:
curl -X 'GET' \
  'http://127.0.0.1:8000/verify/rcpt?email=test%40gmail.com&sender_email=info%40filterdns.net&port=25' \
  -H 'accept: application/json'
Example False:
{
  "system_id": "1.0.7",
  "email": "test@gmail.com",
  "message": "No such user!",
  "status": false,
  "MX": [
    "alt3.gmail-smtp-in.l.google.com.",
    "gmail-smtp-in.l.google.com.",
    "alt1.gmail-smtp-in.l.google.com.",
    "alt2.gmail-smtp-in.l.google.com.",
    "alt4.gmail-smtp-in.l.google.com."
  ],
  "smtplib_code": 250,
  "method_code": 550,
  "method": "rcpt",
  "web_auth_code": null,
  "data": "RCPT code: 550, port: 25"
}
Example True:
{
  "system_id": "1.0.7",
  "email": "validemail@gmail.com",
  "message": "Valid email",
  "status": true,
  "MX": [
    "alt1.gmail-smtp-in.l.google.com.",
    "alt3.gmail-smtp-in.l.google.com.",
    "gmail-smtp-in.l.google.com.",
    "alt2.gmail-smtp-in.l.google.com.",
    "alt4.gmail-smtp-in.l.google.com."
  ],
  "smtplib_code": 250,
  "method_code": 250,
  "method": "rcpt",
  "web_auth_code": null,
  "data": "RCPT code: 250, port: 25"
}

When a mailbox exists but is full and cannot receive mail:

Example True(quote expired):
{
  "system_id": "1.0.7",
  "email": "noquote@gmail.com",
  "message": "Quota expired!",
  "status": true,
  "MX": [
    "alt1.gmail-smtp-in.l.google.com.",
    "alt3.gmail-smtp-in.l.google.com.",
    "gmail-smtp-in.l.google.com.",
    "alt2.gmail-smtp-in.l.google.com.",
    "alt4.gmail-smtp-in.l.google.com."
  ],
  "smtplib_code": 250,
  "method_code": 452,
  "method": "rcpt",
  "web_auth_code": null,
  "data": "RCPT code: 452, port: 25"
}
  1. VRFY method on port 587:
Example Curl:
   curl -X 'GET' \
  'http://127.0.0.1:8000/verify/vrfy?email=test%40gmail.com&sender_email=info%40filterdns.net&port=587' \
  -H 'accept: application/json'
Example False:
{
  "system_id": "1.0.7",
  "email": "test@gmail.com",
  "message": "SMTP connection failed",
  "status": false,
  "MX": [
    "alt1.gmail-smtp-in.l.google.com.",
    "alt4.gmail-smtp-in.l.google.com.",
    "alt3.gmail-smtp-in.l.google.com.",
    "alt2.gmail-smtp-in.l.google.com.",
    "gmail-smtp-in.l.google.com."
  ],
  "smtplib_code": null,
  "method_code": null,
  "method": null,
  "web_auth_code": null,
  "data": "VRFY error: timed out, port: 587"
}
  1. EXPN method on port 465:
Example False:
    {
  "system_id": "1.0.7",
  "email": "test@gmail.com",
  "message": "SMTP connection failed",
  "status": false,
  "MX": [
    "alt3.gmail-smtp-in.l.google.com.",
    "gmail-smtp-in.l.google.com.",
    "alt1.gmail-smtp-in.l.google.com.",
    "alt2.gmail-smtp-in.l.google.com.",
    "alt4.gmail-smtp-in.l.google.com."
  ],
  "smtplib_code": null,
  "method_code": null,
  "method": null,
  "web_auth_code": null,
  "data": "EXPN error: timed out, port: 465"
}
  1. MF method on port 25:
Example Curl:
curl -X 'GET' \
  'http://127.0.0.1:8000/verify/mf?email=test%40gmail.com&sender_email=info%40filterdns.net&port=25' \
  -H 'accept: application/json'
Example False:
{
  "system_id": "1.0.7",
  "email": "test@gmail.com",
  "message": "No such user!",
  "status": false,
  "MX": [
    "alt3.gmail-smtp-in.l.google.com.",
    "gmail-smtp-in.l.google.com.",
    "alt1.gmail-smtp-in.l.google.com.",
    "alt2.gmail-smtp-in.l.google.com.",
    "alt4.gmail-smtp-in.l.google.com."
  ],
  "smtplib_code": 250,
  "method_code": 550,
  "method": "mf",
  "web_auth_code": null,
  "data": "MAIL/RCPT code: 550, port: 25"
}

Configuration for Web Verification

For web-based verification (-m web), create url.cfg in the project root:

[mail.ru]
user_exists_url=https://account.mail.ru/api/v1/user/exists
requests_file=mail.ru_requests

[yandex.ru]
user_exists_url=https://passport.yandex.ru/auth/check
requests_file=yandex.ru_requests

Create requests files (e.g., mail.ru_requests):

[method]
type=GET

[headers]
User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
Accept=application/json

[params]
email={email}

License

BSD 3-Clause License. See LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

email_multi_check-1.0.7.tar.gz (20.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

email_multi_check-1.0.7-py3-none-any.whl (10.6 kB view details)

Uploaded Python 3

File details

Details for the file email_multi_check-1.0.7.tar.gz.

File metadata

  • Download URL: email_multi_check-1.0.7.tar.gz
  • Upload date:
  • Size: 20.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for email_multi_check-1.0.7.tar.gz
Algorithm Hash digest
SHA256 1c99632ba98e6c6ee6efaab990696e2b126cd57313b0f22712e1226e3936339d
MD5 378fe14faafb8c965b5670a7f2c53732
BLAKE2b-256 9d0735281f03383076e3beb94ea848369df2af5440a8a5f6e248dc9a6436ac51

See more details on using hashes here.

File details

Details for the file email_multi_check-1.0.7-py3-none-any.whl.

File metadata

File hashes

Hashes for email_multi_check-1.0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 443d5f88f499cdf9b867dc78c24fd711b0bd00a0a709b6d13166647d2f93d85a
MD5 a6dbf2a4b80fbf0d1eeeda6c8a729913
BLAKE2b-256 a320e82f8e7e6a267bddd67f5cf219c49475ab9f4d1388de417e9fd291075c49

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page