Przewiń do głównej treści

#015 - Sprawdź serwer email i adres email w Pythonie i Laravelu

·807 słów·4 min· loading · loading ·

Czasami musisz sprawdzić, czy adres email jest prawidłowy lub czy serwer email jest dostępny.
#

W tym artykule pokażę, jak sprawdzić adres email i serwer email za pomocą Pythona i Laravela.

W moim przypadku mam listę adresów email (z starej bazy danych) i muszę sprawdzić, czy serwer email jest dostępny oraz czy adresy email są prawidłowe. Najprostszym sposobem było stworzenie skryptu w Pythonie.

Następnie spróbowałem przenieść kod Pythona do Laravela. Chciałbym mieć globalną funkcję pomocniczą w Laravelu, aby sprawdzać adresy email i wyświetlać wyniki w plikach Blade.

Python
#

Sprawdzenie adresu email w wierszu poleceń.
#

Sprawdź, czy masz zainstalowane następujące pakiety:

pip install dnspython colorama

Poniższy skrypt sprawdzi, czy adres email jest prawidłowy i czy domena email ma rekordy MX. Używa modułu re do walidacji formatu adresu email oraz modułu dns.resolver z pakietu dnspython do sprawdzania rekordów MX domeny email. Po uruchomieniu skryptu zostaniesz poproszony o podanie adresu email, a skrypt wyświetli, czy email jest prawidłowy, czy nie.

import re
import dns.resolver
from colorama import init, Fore, Style

# Initialize colorama
init()

# Function to validate email addresses using a comprehensive regex
def is_valid_email(email):
    regex = r'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'
    return re.match(regex, email) is not None

# Function to check if the email domain has MX records
def has_mx_record(email):
    domain = email.split('@')[-1]
    try:
        answers = dns.resolver.resolve(domain, 'MX')
        return True if answers else False
    except (dns.resolver.NoAnswer, dns.resolver.NXDOMAIN, dns.exception.DNSException) as e:
        print(f"{Fore.YELLOW}DNS lookup failed for domain {domain}: {e}{Style.RESET_ALL}")
        return False

# Common domains that should always pass the MX check
common_domains = ['gmail.com', 'yahoo.com', 'outlook.com', 'hotmail.com']

# Get the email address from the user
email = input("Enter the email address to check: ").strip().lower()

# Validate the email address
if not is_valid_email(email):
    print(f"{Fore.RED}Invalid email format: {email}{Style.RESET_ALL}")
elif email.split('@')[-1] not in common_domains and not has_mx_record(email):
    print(f"{Fore.RED}Email has no valid MX record: {email}{Style.RESET_ALL}")
else:
    print(f"{Fore.GREEN}Email is valid: {email}{Style.RESET_ALL}")

Proponuję nazwę pliku check_email_console.py i uruchomienie go w linii poleceń.

python3 check_email_console.py

Sprawdzenie wielu adresów email z pliku.
#

Na podstawie poprzedniego skryptu stworzyłem skrypt, który odczytuje adresy email z pliku i sprawdza, czy adresy email są prawidłowe oraz czy domeny email mają rekordy MX. Adresy email do sprawdzenia powinny być przechowywane w pliku (np. emails_input.txt). Każdy adres email w nowej lini. Wyniki będą zapisane w dwóch plikach: emails_output_valid.txt i emails_output_invalid.txt. Nazwę pliku i ścieżkę można zmienić w skrypcie w sekcji # File paths.

Jak wcześniej, należy zainstalować następujące pakiety:

pip install dnspython colorama

Kod:

import re
import dns.resolver
from colorama import init, Fore, Style

# Initialize colorama
init()

# Function to validate email addresses using a comprehensive regex
def is_valid_email(email):
    regex = r'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'
    return re.match(regex, email) is not None

# Function to check if the email domain has MX records
def has_mx_record(email):
    domain = email.split('@')[-1]
    try:
        answers = dns.resolver.resolve(domain, 'MX')
        return True if answers else False
    except (dns.resolver.NoAnswer, dns.resolver.NXDOMAIN, dns.exception.DNSException) as e:
        print(f"{Fore.YELLOW}DNS lookup failed for domain {domain}: {e}{Style.RESET_ALL}")
        return False

# Common domains that should always pass the MX check
common_domains = ['gmail.com', 'yahoo.com', 'outlook.com', 'hotmail.com']

# File paths
input_file_path = 'emails_input.txt'
valid_output_file_path = 'emails_output_valid.txt'
invalid_output_file_path = 'emails_output_invalid.txt'

# Read emails from the input file
try:
    with open(input_file_path, 'r') as file:
        emails = [line.strip().lower() for line in file if line.strip()]
except FileNotFoundError:
    print(f"File not found: {input_file_path}")
    exit()

# Lists to store valid and invalid emails
valid_emails = []
invalid_emails = []

# Validate each email
for email in emails:
    if not is_valid_email(email):
        print(f"{Fore.RED}Invalid email format: {email}{Style.RESET_ALL}")
        invalid_emails.append(email)
    elif email.split('@')[-1] not in common_domains and not has_mx_record(email):
        print(f"{Fore.RED}Email has no valid MX record: {email}{Style.RESET_ALL}")
        invalid_emails.append(email)
    else:
        print(f"{Fore.GREEN}Email is valid: {email}{Style.RESET_ALL}")
        valid_emails.append(email)

# Write valid emails to the valid output file
with open(valid_output_file_path, 'w') as file:
    for email in valid_emails:
        file.write(email + '\n')

# Write invalid emails to the invalid output file
with open(invalid_output_file_path, 'w') as file:
    for email in invalid_emails:
        file.write(email + '\n')

print(f"{Fore.GREEN}Valid emails have been written to {valid_output_file_path}{Style.RESET_ALL}")
print(f"{Fore.RED}Invalid emails have been written to {invalid_output_file_path}{Style.RESET_ALL}")

Proponuję nazwę pliku check_email_file.py i uruchomienie go w linii poleceń.

python3 check_email_file.py

Laravel
#

Aby stworzyć globalną funkcję pomocniczą w Laravelu, musisz utworzyć nowy plik w katalogu app. W moim przypadku utworzyłem nowy plik o nazwie helpers.php.

<?php

if (!function_exists('isValidEmail')) {
    /**
     * Check if an email is valid and has an MX record.
     *
     * @param string $email
     * @return bool
     */
    function isValidEmail($email)
    {
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            return false;
        }

        $domain = substr(strrchr($email, "@"), 1);

        return checkdnsrr($domain, 'MX');
    }
}

Następnie musisz dodać następujący kod do pliku composer.json:

 "autoload": {
        "files": [
        "app/helpers.php"
    ],
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        }
    },

Wykonaj polecenie:

composer dump-autoload

Teraz możesz używać funkcji isValidEmail w swoim projekcie Laravel. Na przykład w pliku Blade:

@if(isValidEmail('[email protected]'))
    <p>Email is valid</p>
@else
    <p>Email is invalid, or the email server is not reachable</p>

Wnioski
#

W tym artykule pokazałem, jak sprawdzić adres email i serwer email za pomocą Pythona i Laravela. Mam nadzieję, że artykuł okazał się pomocny.

Żródła
#