- Регистрация
- 10.04.2016
- Сообщения
- 468
- Благодарностей
- 333
- Баллы
- 63
Валидатор почтовых адресов сервиса mailru. Многопоточный шаблон.
Шаблон проверяет существование почтовых адресов сервиса mailru(mail.ru list.ru bk.ru internet.ru inbox.ru).
Используем API сервиса mail.ru.
Плюсы:
1.Большая скорость проверки
2.Не нужны свои аккаунты
3.Не нужны затраты на капчу
Минусы
Возможно заблокированные почты считаются существующими(не проверял)
Но таких не много. И обычно бывает достаточно этого шаблона.
В любом случае, если нужна 100% гарантия, можно прогнать и отсеять невалидные почты этим шаблоном,
а потом запустить допроверку оставшихся адресов шаблоно, который проверяет используя ваши акки и тратит деньги на капчу.
При больших объёмах довольно существенная экономия.
Основной код в кубике:
var ch = new MailRuChecker(project);
string proxy = "";
string mail = "";
// Берем прокси email из файлов Блокировка для многопотока
lock(CommonCode.SyncObject)
{
// Прокси берем по кругу, mail с удалением
proxy = ch.strFileEnd(project.Directory + @"\proxy.txt");
mail = ch.strFileDel(project.Directory + @"\mail.txt");
}
//Распариваем прокси
string ipport = "http://" + proxy.Split('@')[1];
string user = proxy.Split('@')[0].Split(':')[0];
string pass = proxy.Split('@')[0].Split(':')[1];
//Добавляем прокси в переменные класса
ch.SetProxy(ipport , user , pass);
//Запрос на существование
bool exists = ch.CheckMailRuAddress(mail);
//Eсли существует, добавляем в good.txt, если нет - в bad.txt
if(exists)
{
lock(CommonCode.Good)
{
File.AppendAllText(project.Directory + @"\good.txt" , mail + "\r\n");
}
}
else
{
lock(CommonCode.Bad)
{
File.AppendAllText(project.Directory + @"\bad.txt" , mail + "\r\n");
}
}
C#:
namespace check
{
/// <summary>
/// Класс для проверки существования email адресов в системе Mail.ru
/// </summary>
/// <remarks>
/// Поддерживаемые домены: mail.ru, inbox.ru, list.ru, bk.ru, internet.ru
/// Класс использует официальный API Mail.ru для проверки существования пользователей
/// </remarks>
public class MailRuChecker
{
#region Приватные поля
/// <summary>
/// Ссылка на модель проекта ZennoPoster для логирования и доступа к настройкам
/// </summary>
private readonly IZennoPosterProjectModel _project;
/// <summary>
/// Адрес прокси-сервера в формате IP:PORT или HOST:PORT
/// </summary>
private string _proxyAddress;
/// <summary>
/// Имя пользователя для авторизации на прокси-сервере
/// </summary>
private string _proxyUsername;
/// <summary>
/// Пароль для авторизации на прокси-сервере
/// </summary>
private string _proxyPassword;
#endregion
#region Конструктор
/// <summary>
/// Инициализирует новый экземпляр класса MailRuChecker
/// </summary>
/// <param name="project">Модель проекта ZennoPoster для логирования и доступа к настройкам профиля</param>
/// <exception cref="ArgumentNullException">Выбрасывается, если project равен null</exception>
public MailRuChecker(IZennoPosterProjectModel project)
{
_project = project ?? throw new ArgumentNullException(nameof(project));
}
#endregion
#region Публичные методы
/// <summary>
/// Настраивает параметры прокси-сервера для HTTP-запросов
/// </summary>
/// <param name="address">Адрес прокси-сервера в формате IP:PORT или HOST:PORT</param>
/// <param name="username">Имя пользователя для авторизации (может быть null или пустым для анонимного прокси)</param>
/// <param name="password">Пароль для авторизации (может быть null или пустым для анонимного прокси)</param>
/// <remarks>
/// Если address пустой или null, прокси использоваться не будет
/// Для анонимных прокси username и password можно оставить пустыми
/// </remarks>
public void SetProxy(string address, string username, string password)
{
_proxyAddress = address;
_proxyUsername = username;
_proxyPassword = password;
}
/// <summary>
/// Проверяет существование email адреса в системе Mail.ru
/// </summary>
/// <param name="email">Email адрес для проверки (должен принадлежать одному из поддерживаемых доменов)</param>
/// <returns>
/// true - если email адрес существует в системе Mail.ru
/// false - если email адрес не существует, имеет неверный формат или произошла ошибка
/// </returns>
/// <remarks>
/// Метод выполняет следующие действия:
/// 1. Проверяет формат email адреса
/// 2. Извлекает имя пользователя из email
/// 3. Отправляет GET-запрос к API Mail.ru
/// 4. Парсит JSON-ответ и возвращает результат
///
/// Поддерживаемые домены: mail.ru, inbox.ru, list.ru, bk.ru, internet.ru
/// Все ошибки логируются в журнал ZennoPoster
/// </remarks>
public bool CheckMailRuAddress(string email)
{
try
{
// Проверяем формат email адреса перед отправкой запроса
if (!IsValidEmailFormat(email))
{
_project.SendInfoToLog("Неверный формат email: " + email, true);
return false;
}
// Извлекаем имя пользователя из email адреса (часть до символа @)
string username = email.Split('@')[0];
// Формируем URL для запроса к API Mail.ru
// API возвращает информацию о существовании пользователя
string url = $"https://account.mail.ru/api/v1/user/exists?email={username}@mail.ru";
// Создаем HTTP-запрос
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
// Используем User-Agent из профиля ZennoPoster для имитации реального браузера
request.UserAgent = _project.Profile.UserAgent;
// Настраиваем прокси, если он был указан
if (!string.IsNullOrEmpty(_proxyAddress))
{
WebProxy proxy = new WebProxy(_proxyAddress);
// Добавляем авторизацию для прокси, если указаны логин и пароль
if (!string.IsNullOrEmpty(_proxyUsername) && !string.IsNullOrEmpty(_proxyPassword))
{
proxy.Credentials = new NetworkCredential(_proxyUsername, _proxyPassword);
}
request.Proxy = proxy;
}
// Выполняем HTTP-запрос и обрабатываем ответ
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
// Проверяем успешность запроса
if (response.StatusCode == HttpStatusCode.OK)
{
// Читаем содержимое ответа
using (Stream dataStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(dataStream))
{
string responseFromServer = reader.ReadToEnd();
// Парсим JSON-ответ от API Mail.ru
JObject jsonResponse = JObject.Parse(responseFromServer);
// Извлекаем значение поля "exists" из секции "body"
// Это поле указывает, существует ли пользователь с данным email
bool exists = jsonResponse["body"]["exists"].Value<bool>();
return exists;
}
}
}
}
catch (WebException ex)
{
// Обрабатываем ошибки сети (таймауты, недоступность сервера, HTTP-ошибки)
_project.SendInfoToLog($"Ошибка при проверке email {email}: {ex.Message}", true);
}
catch (Exception ex)
{
// Обрабатываем все остальные ошибки (парсинг JSON, неожиданные исключения)
_project.SendInfoToLog($"Неожиданная ошибка при проверке email {email}: {ex.Message}", true);
}
// Возвращаем false в случае любой ошибки
return false;
}
#endregion
#region Приватные методы
/// <summary>
/// Проверяет соответствие email адреса поддерживаемому формату
/// </summary>
/// <param name="email">Email адрес для проверки</param>
/// <returns>true, если email соответствует поддерживаемому формату; иначе false</returns>
/// <remarks>
/// Метод использует регулярное выражение для проверки:
/// - Наличие символов до знака @
/// - Отсутствие пробелов и дополнительных символов @
/// - Принадлежность к одному из поддерживаемых доменов:
/// mail.ru, inbox.ru, list.ru, bk.ru, internet.ru
///
/// Проверка выполняется без учета регистра символов
/// </remarks>
private bool IsValidEmailFormat(string email)
{
// Регулярное выражение для проверки email адресов Mail.ru и связанных доменов
// ^[^@\s]+ - один или более символов, кроме @ и пробелов в начале
// @ - обязательный символ @
// (mail\.ru|inbox\.ru|list\.ru|bk\.ru|internet\.ru) - один из поддерживаемых доменов
// $ - конец строки
string pattern = @"^[^@\s]+@(mail\.ru|inbox\.ru|list\.ru|bk\.ru|internet\.ru)$";
return Regex.IsMatch(email, pattern, RegexOptions.IgnoreCase);
}
#endregion
public string strFileEnd(string nf)
{
if (!File.Exists(nf))
{
_project.SendErrorToLog("Нет файла " + nf);
return "";
}
string[] m = File.ReadAllLines(nf);
if (m.Length == 0)
{
_project.SendErrorToLog("Пустой файл " + nf);
return "";
}
string s = m[0];
List<string> ls = new List<string>();
ls = m.ToList();
ls.RemoveAt(0);
ls.Add(s);
File.WriteAllLines(nf, ls);
return s;
}
public string strFileDel(string nf)
{
if (!File.Exists(nf))
{
_project.SendErrorToLog("Нет файла " + nf);
return "";
}
string[] m = File.ReadAllLines(nf);
if (m.Length == 0)
{
_project.SendErrorToLog("Пустой файл " + nf, true);
return "";
}
string s = m[0];
List<string> ls = new List<string>();
ls = m.ToList();
ls.RemoveAt(0);
//ls.Add(s);
File.WriteAllLines(nf, ls);
return s;
}
}
}
Видео работы шаблона и обзор
Шаблон и readme.txt:
Вложения
-
275,6 КБ Просмотры: 8
Последнее редактирование: