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.