Как настроить получение почты по SSL через компоненту DialMail в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При использовании внешней компоненты DialMail.dll в платформе 1С 7.7 разработчики часто сталкиваются с ошибкой подключения к POP3-серверам популярных почтовых сервисов (Mail.ru, Gmail, Yandex). Вызов метода Подключиться() возвращает 0, а программа выдает сообщение "Не смогли подключиться к POP3-серверу". Рассмотрим подробнее, почему возникают подобные сбои и как правильно настроить работу с защищенным соединением SSL/TLS.

Причины ошибок подключения и их устранение

Современные почтовые службы требуют обязательно использовать безопасное шифрованное соединение SSL/TLS. Простая передача параметров подключения в DialMail без дополнительной настройки системы приводит к сбою. Проанализируем основные причины неисправности:

  1. Отсутствие системных библиотек OpenSSL: Для реализации шифрования SSL компонента DialMail использует внешние динамические библиотеки OpenSSL (в частности, libeay32.dll и ssleay32.dll). Если они отсутствуют в системе, подключение по защищенным портам завершается ошибкой.
  2. Настройки безопасности почтового ящика: В большинстве сервисов запрещен вход по основному паролю учетной записи при использовании сторонних программ. Потребуется сгенерировать специальный пароль для внешних приложений в разделе безопасности почтового ящика.
  3. Запрет протокола POP3 в параметрах почты: Убедитесь, что в настройках самого почтового ящика включен доступ по протоколу POP3.

Чтобы решить проблему с SSL на уровне операционной системы, скопируйте необходимые библиотеки OpenSSL в системные каталоги Windows:

Пример кода 1С 7.7 для подключения и получения почты

Разберем по шагам реализацию процедуры получения почтовых сообщений. Передадим объекту AddIn.POP3 параметры SSL-подключения, активируем ведение лог-файла для отладки и обработаем ответ сервера.


Процедура Выполнить() 
    Если ЗагрузитьВнешнююКомпоненту("DialMail.dll") = 0 Тогда
        Сообщить("Не удалось обнаружить компоненту DialMail.dll!");  
        Возврат;
    КонецЕсли;

    Попытка
        ПолучениеПочты = СоздатьОбъект("AddIn.POP3");
        SystComm = СоздатьОбъект("AddIn.SystComm");
        ПолучениеПочты.ВестиЛогФайл = 1;
        Сообщить("Версия компоненты: " + SystComm.Версия);
    Исключение 
        Сообщить("Не удалось создать объекты из компоненты DialMail.dll!");
        Возврат;
    КонецПопытки; 

    ПолучениеПочты.РабочийКаталог = РабочийКаталог; 
    ПолучениеПочты.ИспользоватьПрокси = 0;
    ПолучениеПочты.ИспользоватьSSL = 1; // Включаем SSL-шифрование

    // Параметры для Mail.ru: pop.mail.ru, порт 995
    // Параметры для Gmail: pop.gmail.com, порт 995
    Если ПолучениеПочты.Подключиться(Pop3Сервер, Pop3Порт, Pop3Пользователь, Pop3Пароль) = 0 Тогда    
        Предупреждение("Не смогли подключиться к POP3-серверу"); 
        Возврат;
    КонецЕсли;  

    ВсегоПисемНаСервере = ПолучениеПочты.КоличествоПисем;
    ОбщаяДлинаПолучение = Число(ПолучениеПочты.ОбщийРазмерПисем);  

    Если ВсегоПисемНаСервере > 0 Тогда
        Сообщить("Всего писем на сервере = " + ВсегоПисемНаСервере);
        Сообщить("Общий объем = " + ОбщаяДлинаПолучение + " байт"); 
    Иначе
        Предупреждение("Нет писем для скачивания");  
        Возврат;
    КонецЕсли;  

    СтрокаНомеровПисем = "";
    Если ПолучениеПочты.ПолучитьВсеПисьма(1, 0, 1, СтрокаНомеровПисем) = -100 Тогда
        Сообщить("Ошибка при скачивании писем");
        Возврат;
    КонецЕсли;  

    РаспаковатьВсеПисьма();
КонецПроцедуры

Для корректного отслеживания ошибок и статуса выполнения загрузки обязательно добавьте в модуль формы или объекта обработчик внешних событий ОбработкаВнешнегоСобытия:


Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
    Если Источник = "POP3" Тогда 
        Если ВРЕГ(СокрЛП(Событие)) = "RECEIVE" Тогда
            Если ВРЕГ(СокрЛП(Данные)) = "DONE" Тогда
                Сообщить("Загрузка писем завершена.");
                Возврат;
            КонецЕсли;
        ИначеЕсли ВРЕГ(СокрЛП(Событие)) = "ERROR" Тогда
            Сообщить(" Ошибка: " + Данные + " " + СокрЛП(ПолучениеПочты.ПоследняяОшибка));
            Сообщить("Последний ответ сервера: " + ПолучениеПочты.ПоследнийОтветСервера);
            Возврат;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Альтернативный вариант: Использование TLS-туннеля (stunnel)

Если на сервере или рабочей станции с устаревшей версией Windows возникают проблемы с работой библиотек OpenSSL напрямую через компоненту, можно применить локальный туннель stunnel. Утилита принимает незашифрованные подключения от 1С на локальном адресе и перенаправляет их на внешний почтовый сервер через защищенный канал TLS 1.2/1.3.

Пример настройки конфигурационного файла stunnel.conf:


client = yes
output = stunnel-log.txt
debug = 0

[POP3 Mail]
accept = 127.0.0.1:110
connect = pop.mail.ru:995

[SMTP Mail]
accept = 127.0.0.1:25
connect = smtp.mail.ru:465

При использовании stunnel в коде 1С 7.7 укажите параметры местного подключения без SSL:

Предотвращение повторной загрузки писем

Протокол POP3 не поддерживает полноценную синхронизацию статусов прочтения, как протокол IMAP. Даже если письмо помечено как прочитанное в веб-интерфейсе, при очередном вызове команды загрузки POP3-сервер снова передаст его клиентской программе.

Чтобы избежать повторной обработки одних и тех же писем и вложений, примените один из следующих подходов:

  1. Фиксация загруженных писем в базе данных: Сохраняйте уникальные идентификаторы писем (UIDL) или их хэши в справочнике 1С или внешней таблице (например, SQLite). Перед обработкой очередного сообщения проверяйте, заносилось ли оно ранее в базу.
  2. Удаление писем с сервера: В параметрах метода скачивания установите флаг удаления писем с сервера после их получения. Обратите внимание, что фактическое удаление выполняется POP3-сервером только после успешного вызова команды завершения сеанса (Disconnect).
← На главную