Валидатор почтовых адресов сервиса mailru. Многопоточный шаблон.

bvbfor

Client
Регистрация
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:
 

Вложения

Последнее редактирование:
  • Спасибо
Реакции: merlin74 и Gerero

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)