Spaces:
Running
Running
| import re | |
| import random | |
| import string | |
| from typing import List, Dict, Optional | |
| def is_valid_email_format(email: str) -> bool: | |
| """Проверка базового формата email""" | |
| if not email or '@' not in email: | |
| return False | |
| pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' | |
| return re.match(pattern, email) is not None | |
| def extract_domain(email: str) -> Optional[str]: | |
| """Извлечение домена из email""" | |
| if '@' in email: | |
| return email.split('@')[1].lower() | |
| return None | |
| def generate_username(pattern: str = "random") -> str: | |
| """Генерация имени пользователя""" | |
| if pattern == "random": | |
| names = ["john", "jane", "mike", "sarah", "david", "lisa", "robert", "emma"] | |
| return random.choice(names) | |
| elif pattern == "numbers": | |
| names = ["john", "jane", "mike", "sarah", "david", "lisa", "robert", "emma"] | |
| return random.choice(names) + str(random.randint(1, 999)) | |
| else: | |
| return ''.join(random.choices(string.ascii_lowercase, k=8)) | |
| def clean_email_list(emails: str) -> List[str]: | |
| """Очистка списка email от дубликатов и пустых строк""" | |
| email_list = [] | |
| for email in emails.split('\n'): | |
| email = email.strip() | |
| if email and email not in email_list: | |
| email_list.append(email) | |
| return email_list | |
| def format_validation_results(results: List[Dict]) -> List[List]: | |
| """Форматирование результатов для отображения в таблице""" | |
| formatted = [] | |
| for result in results: | |
| formatted.append([ | |
| result.get("email", ""), | |
| result.get("overall_status", "unknown"), | |
| "✓" if result.get("format_valid", False) else "✗", | |
| "✓" if result.get("domain_valid", False) else "✗", | |
| "✓" if result.get("mx_valid", False) else "✗", | |
| result.get("smtp_valid", "unknown") | |
| ]) | |
| return formatted | |
| def get_status_color(status: str) -> str: | |
| """Получение цвета для статуса""" | |
| colors = { | |
| "valid": "#28a745", | |
| "invalid": "#dc3545", | |
| "disposable": "#ffc107", | |
| "unknown": "#6c757d", | |
| "error": "#dc3545", | |
| "invalid_domain": "#dc3545" | |
| } | |
| return colors.get(status, "#6c757d") | |
| def generate_sample_emails(count: int = 5) -> List[str]: | |
| """Генерация примеров email для демонстрации""" | |
| samples = [ | |
| "john.doe@gmail.com", | |
| "invalid-email", | |
| "test@nonexistentdomain12345.com", | |
| "user@10minutemail.com", | |
| "admin@github.com" | |
| ] | |
| return samples[:count] | |
| def calculate_validation_time(start_time: float, end_time: float) -> str: | |
| """Расчет времени валидации""" | |
| duration = end_time - start_time | |
| if duration < 1: | |
| return f"{int(duration * 1000)} мс" | |
| else: | |
| return f"{duration:.2f} сек" |