SMTP проверка email представляет собой золотой стандарт для подтверждения того, что адрес электронной почты действительно может принимать сообщения. В отличие от базовой проверки синтаксиса или проверки домена, SMTP валидация email напрямую взаимодействует с почтовым сервером получателя, чтобы убедиться, что конкретный почтовый ящик существует и способен принимать электронную почту. Эта мощная техника проверки email формирует основу профессиональных сервисов верификации и помогает компаниям поддерживать чистые списки адресов, защищать репутацию отправителя и улучшать доставляемость писем.
Понимание SMTP проверки email
SMTP, протокол передачи простой почты (Simple Mail Transfer Protocol), является интернет-стандартом для передачи электронной почты. Каждый раз, когда вы отправляете email, ваш почтовый клиент или сервер использует SMTP для доставки сообщения на почтовый сервер получателя. SMTP проверка email использует тот же протокол, чтобы проверить, существует ли адрес электронной почты — но без фактической отправки какого-либо сообщения.
Красота SMTP верификации заключается в её способности проверять адреса электронной почты у источника. Вместо того чтобы угадывать, действителен ли адрес на основе формата или домена, проверка SMTP напрямую спрашивает почтовый сервер: "Примете ли вы почту для этого адреса?" Ответ сервера показывает, существует ли почтовый ящик, заполнен ли он или был деактивирован.
Как работает SMTP проверка email
Процесс SMTP верификации следует определенной последовательности команд, которая имитирует начало доставки email, но останавливается до фактической отправки содержимого сообщения. Вот пошаговая разбивка:
Шаг 1: DNS поиск MX записей
Прежде чем подключиться к любому почтовому серверу, процесс верификации должен определить, какой сервер обрабатывает почту для домена. Это включает запрос DNS для записей Mail Exchange (MX). Домен может иметь несколько MX записей с разными приоритетами, что позволяет использовать резервные серверы, если основной недоступен.
Шаг 2: Установка TCP соединения
После идентификации почтового сервера верификатор устанавливает TCP соединение на порту 25 (стандартный SMTP порт) или альтернативных портах, таких как 587 или 465 для отправки.
Шаг 3: SMTP приветствие (HELO/EHLO)
Соединение начинается с приветствия. Верификатор отправляет команду EHLO (Extended HELO) или HELO, чтобы представиться почтовому серверу. Сервер отвечает своими возможностями и подтверждает готовность продолжить.
Шаг 4: Команда MAIL FROM
Верификатор указывает адрес отправителя, используя команду MAIL FROM. Хотя этот адрес не обязательно должен быть окончательным отправителем, почтовые серверы могут отклонить попытки верификации, если домен MAIL FROM не имеет правильных DNS записей или выглядит подозрительно.
Шаг 5: Команда RCPT TO (критический шаг)
Здесь происходит фактическая верификация. Верификатор отправляет команду RCPT TO с проверяемым адресом электронной почты. Ответ почтового сервера на эту команду указывает, существует ли почтовый ящик:
- 250 OK: Почтовый ящик существует и может принимать почту
- 550 User unknown: Почтовый ящик не существует
- 551 User not local: Сервер знает о пользователе, но предлагает другой адрес
- 552 Mailbox full: Почтовый ящик существует, но не может принимать сообщения
- 553 Mailbox name not allowed: Синтаксис адреса отклонен
Шаг 6: QUIT
После получения ответа RCPT TO верификатор отправляет QUIT, чтобы корректно закрыть соединение без фактической отправки сообщения.
Объяснение кодов ответа SMTP
Понимание кодов ответа SMTP необходимо для создания точных систем проверки email. Эти трехзначные коды несут конкретные значения, которые определяют результаты верификации.
Коды успеха 2xx
- 250: Запрошенное действие выполнено успешно (email существует)
- 251: Пользователь не локальный; будет переадресован по указанному пути
Коды временной ошибки 4xx
- 421: Сервис недоступен, закрытие канала передачи
- 450: Запрошенное действие не выполнено: почтовый ящик недоступен (занят/временно заблокирован)
- 451: Запрошенное действие прервано: локальная ошибка обработки
- 452: Запрошенное действие не выполнено: недостаточно места в системе
Коды постоянной ошибки 5xx
- 550: Запрошенное действие не выполнено: почтовый ящик недоступен (не существует)
- 551: Пользователь не локальный; попробуйте другой путь
- 552: Запрошенное действие прервано: превышена выделенная квота хранилища
- 553: Запрошенное действие не выполнено: имя почтового ящика не разрешено
- 554: Транзакция не удалась
Различие между кодами 4xx и 5xx имеет большое значение. Ответ 4xx предполагает временные проблемы — почтовый ящик может стать доступным позже. Ответ 5xx указывает на постоянную ошибку — адрес следует считать недействительным.
Реализация SMTP проверки email
Создание системы SMTP верификации требует тщательного внимания к деталям протокола, обработке ошибок и ограничению скорости. Вот практическое руководство по реализации.
Базовый поток SMTP верификации
Следующий псевдокод иллюстрирует основную логику валидации:
function verifyEmail(email):
domain = extractDomain(email)
// Step 1: Get MX records
mxRecords = getMXRecords(domain)
if mxRecords is empty:
return INVALID_DOMAIN
// Sort by priority (lowest number = highest priority)
sortByPriority(mxRecords)
// Try each MX server
for mx in mxRecords:
try:
// Step 2: Connect
connection = connectSMTP(mx.host, 25)
// Step 3: EHLO
response = sendCommand("EHLO verifier.example.com")
if response.code != 250:
continue // Try next MX
// Step 4: MAIL FROM
response = sendCommand("MAIL FROM:<verify@example.com>")
if response.code != 250:
continue
// Step 5: RCPT TO
response = sendCommand("RCPT TO:<" + email + ">")
// Step 6: QUIT
sendCommand("QUIT")
closeConnection()
// Interpret result
if response.code == 250:
return VALID
else if response.code >= 500:
return INVALID
else:
return UNKNOWN
catch ConnectionError:
continue // Try next MX
return UNABLE_TO_VERIFY
Реализация на Node.js
Вот практическая реализация на Node.js с использованием нативных модулей net и dns:
const dns = require('dns');
const net = require('net');
async function verifyEmailSMTP(email) {
const domain = email.split('@')[1];
// Get MX records
const mxRecords = await new Promise((resolve, reject) => {
dns.resolveMx(domain, (err, addresses) => {
if (err) reject(err);
else resolve(addresses.sort((a, b) => a.priority - b.priority));
});
});
if (!mxRecords || mxRecords.length === 0) {
return { valid: false, reason: 'No MX records found' };
}
// Try each MX server
for (const mx of mxRecords) {
try {
const result = await checkMailbox(mx.exchange, email);
return result;
} catch (err) {
continue; // Try next MX server
}
}
return { valid: null, reason: 'Unable to verify' };
}
function checkMailbox(mxHost, email) {
return new Promise((resolve, reject) => {
const socket = net.createConnection(25, mxHost);
let step = 0;
let response = '';
socket.setTimeout(10000);
socket.on('data', (data) => {
response = data.toString();
const code = parseInt(response.substring(0, 3));
switch (step) {
case 0: // Server greeting
if (code === 220) {
socket.write('EHLO verifier.example.com\r\n');
step++;
} else {
socket.end();
reject(new Error('Server rejected connection'));
}
break;
case 1: // EHLO response
if (code === 250) {
socket.write('MAIL FROM:<verify@example.com>\r\n');
step++;
} else {
socket.end();
reject(new Error('EHLO failed'));
}
break;
case 2: // MAIL FROM response
if (code === 250) {
socket.write(`RCPT TO:<${email}>\r\n`);
step++;
} else {
socket.end();
reject(new Error('MAIL FROM rejected'));
}
break;
case 3: // RCPT TO response - the verification result
socket.write('QUIT\r\n');
socket.end();
if (code === 250) {
resolve({ valid: true, reason: 'Mailbox exists' });
} else if (code >= 500) {
resolve({ valid: false, reason: 'Mailbox does not exist', code });
} else {
resolve({ valid: null, reason: 'Unable to determine', code });
}
break;
}
});
socket.on('timeout', () => {
socket.end();
reject(new Error('Connection timeout'));
});
socket.on('error', (err) => {
reject(err);
});
});
}
Реализация на Python
Python предлагает чистую SMTP верификацию с помощью модуля smtplib:
import dns.resolver
import smtplib
import socket
def verify_email_smtp(email):
domain = email.split('@')[1]
# Get MX records
try:
mx_records = dns.resolver.resolve(domain, 'MX')
mx_hosts = sorted([(r.preference, str(r.exchange).rstrip('.'))
for r in mx_records])
except dns.resolver.NXDOMAIN:
return {'valid': False, 'reason': 'Domain does not exist'}
except dns.resolver.NoAnswer:
return {'valid': False, 'reason': 'No MX records found'}
# Try each MX server
for priority, mx_host in mx_hosts:
try:
result = check_mailbox(mx_host, email)
if result['valid'] is not None:
return result
except Exception as e:
continue
return {'valid': None, 'reason': 'Unable to verify'}
def check_mailbox(mx_host, email):
try:
# Connect to SMTP server
smtp = smtplib.SMTP(timeout=10)
smtp.connect(mx_host, 25)
# EHLO
code, message = smtp.ehlo('verifier.example.com')
if code != 250:
smtp.quit()
return {'valid': None, 'reason': 'EHLO failed'}
# MAIL FROM
code, message = smtp.mail('verify@example.com')
if code != 250:
smtp.quit()
return {'valid': None, 'reason': 'MAIL FROM rejected'}
# RCPT TO - the verification step
code, message = smtp.rcpt(email)
smtp.quit()
if code == 250:
return {'valid': True, 'reason': 'Mailbox exists'}
elif code >= 500:
return {'valid': False, 'reason': 'Mailbox does not exist', 'code': code}
else:
return {'valid': None, 'reason': 'Temporary failure', 'code': code}
except socket.timeout:
return {'valid': None, 'reason': 'Connection timeout'}
except smtplib.SMTPServerDisconnected:
return {'valid': None, 'reason': 'Server disconnected'}
except Exception as e:
return {'valid': None, 'reason': str(e)}
Проблемы в SMTP проверке email
Хотя SMTP верификация является мощным инструментом, несколько проблем могут усложнить реализацию и повлиять на точность.
Catch-All домены
Некоторые почтовые серверы настроены как catch-all, принимая почту на любой адрес в своем домене независимо от того, существует ли конкретный почтовый ящик. Когда вы отправляете RCPT TO для любого адреса — даже случайных символов — сервер отвечает 250 OK.
Конфигурации catch-all делают SMTP валидацию email неспособной различить действительные и недействительные адреса в этом домене. Профессиональные сервисы проверки email, такие как BillionVerify, реализуют специализированные алгоритмы обнаружения catch-all для идентификации этих доменов и предоставления соответствующих оценок достоверности.
Greylisting
Greylisting — это антиспам-техника, при которой почтовые серверы временно отклоняют электронную почту от неизвестных отправителей. Первая попытка SMTP подключения возвращает временную ошибку 4xx. Легитимные почтовые серверы повторяют попытку доставки, в то время как многие спам-системы этого не делают.
Для проверки email greylisting проявляется как временная ошибка. Правильная реализация требует:
- Распознавания ответов greylisting (часто 450 или 451)
- Реализации логики повторных попыток с соответствующими задержками
- Отслеживания серверов, использующих greylisting
Ограничение скорости и блокировка
Почтовые серверы защищают себя от злоупотреблений, ограничивая количество подключений. Слишком много попыток верификации с одного IP-адреса за короткое время может вызвать:
- Временные блокировки (ответы 4xx)
- Постоянное занесение в черный список
- Тайм-ауты подключения
- CAPTCHA или другие проверки
Профессиональные сервисы проверки email распределяют запросы верификации между многими IP-адресами и реализуют сложное ограничение скорости, чтобы избежать этих защит.
Ложные срабатывания и ложные отрицания
SMTP проверка email не является 100% точной. Несколько сценариев могут привести к неправильным результатам:
Ложные срабатывания (сообщение о недействительных как действительных)
- Catch-all домены, принимающие всё
- Серверы, принимающие во время SMTP, но отклоняющие позже
- Полные почтовые ящики, которые всё еще принимают подключения
Ложные отрицания (сообщение о действительных как недействительных)
- Greylisting, отклоняющий первые попытки
- Ограничение скорости, блокирующее легитимные проверки
- Неправильная конфигурация сервера
- Временные сбои
Различия в SMTP серверах
Различные почтовые серверы реализуют SMTP с вариациями, которые влияют на верификацию:
Microsoft Exchange/Office 365
- Часто требует аутентификации для подробных ответов
- Может принимать во время SMTP, но отклонять доставку позже
- Реализует сложные меры против спама
Gmail/Google Workspace
- Обычно надежен при принятии/отклонении
- Может ограничить скорость агрессивных попыток верификации
- Возвращает последовательные ответы
Yahoo Mail
- Известен строгим ограничением скорости
- Может требовать решения задач
- Реализует greylisting
Пользовательские почтовые серверы
- Поведение сильно варьируется
- Могут иметь нестандартные конфигурации
- Настройки безопасности влияют на точность верификации
Лучшие практики для SMTP проверки email
Создание надежной SMTP верификации требует следования проверенным лучшим практикам.
Правильная конфигурация EHLO/HELO
Ваше имя хоста EHLO должно:
- Разрешаться в IP вашего сервера верификации
- Иметь действительную обратную DNS запись (PTR запись)
- Не быть в черных списках
- Быть легитимным доменом, которым вы управляете
EHLO verify.yourdomain.com
Избегайте общих или подозрительных имен хостов, которые запускают спам-фильтры.
Выбор адреса MAIL FROM
Адрес MAIL FROM имеет значение для принятия верификации:
- Используйте реальный домен с действительными MX записями
- Убедитесь, что SPF записи разрешают ваш сервер верификации
- Рассмотрите использование домена, выделенного для верификации
- Избегайте известных доменов спам-ловушек
Управление соединениями
Эффективное управление соединениями улучшает скорость и надежность верификации:
// Connection pooling example
class SMTPConnectionPool {
constructor(maxConnections = 10) {
this.pools = new Map(); // Domain -> connections
this.maxConnections = maxConnections;
}
async getConnection(mxHost) {
if (!this.pools.has(mxHost)) {
this.pools.set(mxHost, []);
}
const pool = this.pools.get(mxHost);
// Reuse existing connection if available
if (pool.length > 0) {
return pool.pop();
}
// Create new connection
return await this.createConnection(mxHost);
}
releaseConnection(mxHost, connection) {
const pool = this.pools.get(mxHost);
if (pool && pool.length < this.maxConnections) {
pool.push(connection);
} else {
connection.end();
}
}
}
Конфигурация тайм-аутов
Установите соответствующие тайм-ауты, чтобы избежать зависания на неотвечающих серверах:
const TIMEOUT_CONFIG = {
connection: 10000, // 10 seconds to establish connection
greeting: 30000, // 30 seconds for server greeting
command: 30000, // 30 seconds per command response
total: 60000 // 60 seconds maximum per verification
};
Обработка ошибок и логика повторных попыток
Реализуйте надежную обработку ошибок с интеллектуальными повторами:
async function verifyWithRetry(email, maxRetries = 3) {
const delays = [1000, 5000, 15000]; // Exponential backoff
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const result = await verifyEmailSMTP(email);
// Don't retry if we got a definitive answer
if (result.valid !== null) {
return result;
}
// Check if error is retryable
if (isGreylisting(result) || isTemporaryError(result)) {
await sleep(delays[attempt]);
continue;
}
return result;
} catch (err) {
if (attempt === maxRetries - 1) {
return { valid: null, reason: err.message };
}
await sleep(delays[attempt]);
}
}
}
function isGreylisting(result) {
return result.code === 450 || result.code === 451;
}
function isTemporaryError(result) {
return result.code >= 400 && result.code < 500;
}
Реализация ограничения скорости
Защитите свою инфраструктуру верификации и поддерживайте хорошую репутацию:
class RateLimiter {
constructor() {
this.domainLimits = new Map();
this.globalCounter = 0;
this.globalLimit = 100; // per second
this.domainLimit = 10; // per second per domain
}
async waitForSlot(domain) {
// Check global limit
while (this.globalCounter >= this.globalLimit) {
await sleep(100);
}
// Check domain limit
const domainCount = this.domainLimits.get(domain) || 0;
while (domainCount >= this.domainLimit) {
await sleep(100);
}
// Reserve slot
this.globalCounter++;
this.domainLimits.set(domain, domainCount + 1);
// Release after 1 second
setTimeout(() => {
this.globalCounter--;
this.domainLimits.set(domain,
(this.domainLimits.get(domain) || 1) - 1);
}, 1000);
}
}
SMTP верификация против других методов
Понимание того, как SMTP проверка email сравнивается с другими методами валидации email, помогает выбрать правильный подход.
Проверка синтаксиса
Проверка синтаксиса проверяет, следует ли email правильному формату, используя регулярные выражения. Она быстра и может быть выполнена на стороне клиента, но ловит только очевидные ошибки форматирования.
Сильные стороны:
- Мгновенные результаты
- Нет сетевых запросов
- Ловит опечатки
Ограничения:
- Не может проверить существование
- Многие недействительные адреса электронной почты проходят проверку синтаксиса
Проверка домена/MX
Проверка MX записей подтверждает, что домен может принимать email, проверяя наличие записей почтового сервера.
Сильные стороны:
- Ловит несуществующие домены
- Быстрый DNS поиск
- Не требует SMTP подключения
Ограничения:
- Не может проверить конкретные почтовые ящики
- Домен может иметь MX, но не иметь действительных пользователей
SMTP верификация
SMTP проверка email подтверждает, что конкретный почтовый ящик существует и может принимать почту.
Сильные стороны:
- Наивысшая точность существования почтового ящика
- Прямое взаимодействие с почтовым сервером
- Ловит многие недействительные адреса
Ограничения:
- Медленнее других методов
- Зависит от catch-all доменов
- Может быть заблокирована ограничением скорости
Иерархия верификации
Комплексная стратегия проверки email объединяет эти методы:
- Проверка синтаксиса - Фильтрация очевидно недействительных форматов
- Проверка домена - Подтверждение существования домена и наличия MX записей
- SMTP верификация - Проверка конкретного почтового ящика
- Дополнительные проверки - Обнаружение одноразовых email, обнаружение ролевых адресов, обнаружение catch-all
Профессиональные сервисы проверки email, такие как BillionVerify, реализуют эту полную иерархию, обрабатывая сложность SMTP валидации и предоставляя дополнительную информацию о качестве email.
Использование профессиональных сервисов SMTP верификации
Хотя создание собственной системы SMTP проверки email является образовательным, производственные приложения часто выигрывают от профессиональных API проверки email, которые обрабатывают всю сложность.
Преимущества профессиональных сервисов
Инфраструктура
- Распределенные серверы верификации по всему миру
- Управление репутацией чистого IP
- Высокая доступность и резервирование
Интеллект
- Обнаружение catch-all доменов
- Идентификация одноразовых email
- Пометка ролевых адресов
- Обнаружение спам-ловушек
Соответствие
- Обработка с соблюдением конфиденциальности
- Безопасная обработка данных
- Аудиторские журналы
Интеграция BillionVerify API
BillionVerify обеспечивает комплексную проверку email, включая SMTP проверки:
async function verifyWithBillionVerify(email) {
const response = await fetch('https://api.billionverify.com/v1/verify', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({ email })
});
const result = await response.json();
return {
isValid: result.is_valid,
isDeliverable: result.is_deliverable,
isCatchAll: result.is_catch_all,
isDisposable: result.is_disposable,
isRoleBased: result.is_role_based,
smtpCheck: result.smtp_check,
mxRecords: result.mx_records,
riskScore: result.risk_score
};
}
API внутренне обрабатывает всю сложность SMTP, предоставляя дополнительную информацию, для репликации которой потребовалась бы значительная инфраструктура.
Массовая SMTP верификация
Для проверки больших списков адресов электронной почты массовая верификация оптимизирует процесс:
async function bulkVerify(emails) {
// Upload file for batch processing
const formData = new FormData();
formData.append('file', createCSV(emails));
const uploadResponse = await fetch('https://api.billionverify.com/v1/bulk/upload', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
},
body: formData
});
const { jobId } = await uploadResponse.json();
// Poll for completion
let status = 'processing';
while (status === 'processing') {
await sleep(5000);
const statusResponse = await fetch(
`https://api.billionverify.com/v1/bulk/status/${jobId}`,
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const job = await statusResponse.json();
status = job.status;
}
// Download results
const resultsResponse = await fetch(
`https://api.billionverify.com/v1/bulk/download/${jobId}`,
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
return await resultsResponse.json();
}
SMTP верификация в реальном времени для форм регистрации
Реализация проверки email в реальном времени во время регистрации пользователей улучшает качество данных с самого начала.
Реализация на фронтенде
// Debounced email verification on input
const emailInput = document.getElementById('email');
let verificationTimeout;
emailInput.addEventListener('input', (e) => {
clearTimeout(verificationTimeout);
const email = e.target.value;
if (!isValidSyntax(email)) {
showError('Please enter a valid email format');
return;
}
verificationTimeout = setTimeout(async () => {
showLoading();
try {
const result = await verifyEmail(email);
if (result.isValid) {
showSuccess('Email verified');
} else if (result.isCatchAll) {
showWarning('Unable to fully verify this email');
} else {
showError('This email address appears invalid');
}
} catch (err) {
// Don't block signup on verification errors
clearStatus();
}
}, 500); // Wait 500ms after typing stops
});
async function verifyEmail(email) {
const response = await fetch('/api/verify-email', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email })
});
return response.json();
}
API endpoint на бэкенде
// Express.js endpoint
app.post('/api/verify-email', async (req, res) => {
const { email } = req.body;
// Quick syntax check first
if (!isValidEmailSyntax(email)) {
return res.json({ isValid: false, reason: 'Invalid syntax' });
}
try {
// Call BillionVerify API for full verification
const result = await billionVerify.verify(email);
res.json({
isValid: result.is_valid && result.is_deliverable,
isCatchAll: result.is_catch_all,
isDisposable: result.is_disposable,
suggestion: result.did_you_mean // Typo suggestions
});
} catch (err) {
// Fail open - don't block signup on API errors
res.json({ isValid: true, verified: false });
}
});
Соображения безопасности для SMTP верификации
SMTP проверка email включает сетевые подключения, требующие осведомленности о безопасности.
Защита вашей инфраструктуры
Конфигурация брандмауэра
- Разрешайте только исходящие SMTP подключения с серверов верификации
- Мониторьте необычные шаблоны подключения
- Блокируйте известные вредоносные диапазоны IP
Использование TLS/SSL
- Используйте STARTTLS, когда доступно
- Проверяйте сертификаты сервера
- Корректно обрабатывайте ошибки сертификатов
Избегание занесения в черные списки
Ваши серверы верификации могут быть занесены в черный список, если они выглядят как отправляющие спам или злоупотребляющие почтовыми серверами:
- Реализуйте строгое ограничение скорости
- Используйте выделенные IP для верификации
- Регулярно отслеживайте статус в черных списках
- Поддерживайте правильный обратный DNS
- Оперативно реагируйте на жалобы о злоупотреблениях
Конфиденциальность данных
Адреса электронной почты являются персональными данными, требующими защиты:
- Не записывайте полные адреса электронной почты без необходимости
- Шифруйте сохраненные результаты верификации
- Реализуйте политики хранения данных
- Соблюдайте GDPR и другие нормативные акты
- Используйте безопасные соединения для вызовов API
Измерение производительности SMTP верификации
Отслеживайте ключевые метрики, чтобы обеспечить хорошую работу вашей системы проверки.
Ключевые метрики
Метрики точности
- Доля истинно положительных результатов (действительные правильно идентифицированы)
- Доля ложных срабатываний (недействительные отмечены как действительные)
- Точность обнаружения catch-all
- Доля неизвестных/невозможно проверить
Метрики производительности
- Среднее время верификации
- 95-й процентиль времени ответа
- Доля успешных подключений
- Доля тайм-аутов по доменам
Операционные метрики
- Ежедневный объем верификации
- Доли ошибок по типам
- Инциденты с черными списками
- Доступность API
Пример панели мониторинга
class VerificationMetrics {
constructor() {
this.counters = {
total: 0,
valid: 0,
invalid: 0,
catchAll: 0,
unknown: 0,
errors: 0
};
this.timings = [];
}
record(result, duration) {
this.counters.total++;
this.timings.push(duration);
if (result.valid === true) this.counters.valid++;
else if (result.valid === false) this.counters.invalid++;
else if (result.isCatchAll) this.counters.catchAll++;
else this.counters.unknown++;
}
recordError() {
this.counters.errors++;
}
getStats() {
const sortedTimings = this.timings.sort((a, b) => a - b);
return {
counts: this.counters,
accuracy: {
validRate: this.counters.valid / this.counters.total,
unknownRate: this.counters.unknown / this.counters.total
},
performance: {
avgTime: average(this.timings),
p95Time: sortedTimings[Math.floor(sortedTimings.length * 0.95)],
errorRate: this.counters.errors / this.counters.total
}
};
}
}
Заключение
SMTP проверка email предоставляет наиболее точный метод для проверки того, может ли адрес электронной почты принимать сообщения. Взаимодействуя напрямую с почтовыми серверами через протокол SMTP, вы можете определить существование почтового ящика без фактической отправки сообщений.
Создание эффективной SMTP верификации требует понимания деталей протокола, обработки различных проблем, таких как catch-all домены и greylisting, а также реализации правильного ограничения скорости и обработки ошибок. Для большинства производственных приложений профессиональные сервисы проверки email, такие как BillionVerify, предоставляют инфраструктуру, интеллект и надежность без сложности создания и обслуживания инфраструктуры верификации.
Независимо от того, реализуете ли вы собственную SMTP валидацию email в образовательных целях или интегрируете профессиональный API проверки email, принципы, рассмотренные в этом руководстве, помогут вам понять, что происходит за кулисами при проверке адресов электронной почты в масштабе.
Помните, что SMTP верификация — это лишь один компонент комплексной валидации email. Её сочетание с проверкой синтаксиса, проверкой домена, обнаружением одноразовых email и идентификацией catch-all создает полную стратегию проверки email, которая защищает вашу репутацию отправителя, улучшает доставляемость email и поддерживает качество ваших списков адресов.
Начните с базовых проверок синтаксиса и домена для немедленной обратной связи, добавьте SMTP верификацию для тщательной валидации и рассмотрите профессиональные сервисы, такие как BillionVerify, когда вам нужна надежность, точность и дополнительная информация, которая исходит от выделенной инфраструктуры проверки email.