Почему ИнтернетПочта в 1С не скачивает письма с pop.yandex.ru и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С с почтовыми сервисами разработчики часто сталкиваются с ситуацией, когда отправка почты или получение заголовков писем проходят успешно, но при попытке скачать сами сообщения платформа выдает критическую ошибку. Особенно часто эта проблема проявляется при работе с почтовым сервером Яндекс по протоколу POP3.

В этой статье мы подробно проанализируем, почему возникает ошибка подключения, расшифруем загадочный ответ сервера со словом "octets", разберем исходный код интеграции и рассмотрим пошаговые сценарии решения этой проблемы, включая переход на более современный протокол и правильную настройку безопасности.

Анализ исходного кода и проявление проблемы

Рассмотрим стандартный пример настройки почтового профиля для получения почты по протоколу POP3, который часто используется в конфигурациях 1С:


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АутентификацияPOP3 = СпособPOP3Аутентификации.Обычная;
Профиль.АдресСервераPOP3 = "pop.yandex.ru";
Профиль.ПортPOP3 = 995;
Профиль.ТолькоЗащищеннаяАутентификацияPOP3 = Ложь;
Профиль.ИспользоватьSSLPOP3 = Истина; 
Профиль.Пароль = "ВашПароль";
Профиль.Пользователь = "ВашЛогин";
Профиль.ВремяОжидания = 150; 

При использовании этого профиля в коде получения писем разработчики обычно применяют следующую последовательность методов:


Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);

// Успешно получаем заголовки писем
Сообщения = Почта.ПолучитьЗаголовки();

// Пытаемся скачать тела писем и вложения — здесь происходит сбой
Сообщения = Почта.Get(Ложь, Сообщения); 

Симптомы проблемы выглядят очень специфично: метод ПолучитьЗаголовки() отрабатывает без нареканий, возвращая массив заголовков и показывая точное количество писем в ящике. Однако при вызове метода Get() (или его аналога Выбрать()) система зависает, после чего аварийно завершает работу с ошибкой:

«Ошибка при вызове метода контекста (Выбрать): Произошла ошибка при работе с POP3. Код ошибки: 3. Ответ сервера: 4379585 octets.»

При этом аналогичный код с настройками для других почтовых сервисов (например, mail.ru) может работать абсолютно корректно.

Выясняем причину: что означает «Код ошибки: 3. Ответ сервера: octets»?

Для того чтобы устранить сбой, нам необходимо разобраться в механике взаимодействия платформы 1С и почтового сервера.

  1. Суть понятия "octets": Слово octets (октеты, синоним байтов) — это не сообщение об ошибке. Это стандартный технический ответ POP3-сервера на команду запроса информации о состоянии ящика (например, команды STAT или LIST). Сервер Яндекс просто сообщает клиенту 1С: «В вашем ящике находятся сообщения общим объемом 4 379 585 байт (примерно 4,17 МБ)».
  2. Почему 1С воспринимает это как ошибку: Код ошибки 3 в платформе 1С означает ошибку чтения из сетевого сокета (таймаут или принудительный разрыв соединения удаленной стороной). Когда 1С запрашивает скачивание писем через метод Get(), сервер Яндекса по какой-то причине мгновенно закрывает сетевое соединение (сбрасывает сессию). Платформа 1С не успевает обработать операцию скачивания, аварийно прерывает выполнение кода и выводит в качестве текста ошибки последнее успешно полученное из буфера сообщение от сервера — ту самую строку со счетчиком байтов (octets).

Почему же Яндекс закрывает соединение именно при попытке скачать тела писем?

---

Варианты решения проблемы

Рассмотрим подробно несколько способов решения проблемы, от простых административных настроек до изменения логики работы в коде 1С.

Решение А. Переход на протокол IMAP (рекомендуемый способ)

Поскольку Яндекс ограничивает работу устаревшего протокола POP3, наиболее надежным и современным решением является перевод интеграции 1С на протокол IMAP. Этот протокол работает быстрее, стабильнее удерживает соединение, умеет работать с папками и не подвержен столь жестким лимитам на объем скачивания в рамках одной сессии.

Перепишем наш код настройки профиля и получения почты под протокол IMAP:


// 1. Настройка профиля для IMAP
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераIMAP = "imap.yandex.ru";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
Профиль.Пользователь = "ваш_логин@yandex.ru"; 
Профиль.Пароль = "ваш_пароль_приложения"; // Пароль приложения (см. Решение Б)
Профиль.ВремяОжидания = 150;

// 2. Подключение и получение писем
Почта = Новый ИнтернетПочта;
Попытка
    Почта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);
    
    // Получаем только непрочитанные письма (параметр отбора)
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Прочитанные", Ложь);
    
    // Скачиваем сообщения полностью
    Сообщения = Почта.Выбрать(Истина, ПараметрыОтбора);
    
    Для Каждого Письмо Из Сообщения Цикл
        // Обработка полученного письма
        Сообщить("Получено письмо от: " + Письмо.Отправитель.Адрес + " Тема: " + Письмо.Тема);
    КонецЦикла;
    
    Почта.Отключиться();
Исключение
    Сообщить("Ошибка при работе с почтой IMAP: " + ОписаниеОшибки());
КонецПопытки;

Использование метода Выбрать() с установленным флагом Истина (первый параметр) позволяет сразу загрузить тела писем и вложения, минуя двухэтапную схему с заголовками, которая в IMAP не требуется.

Решение Б. Использование «Пароля приложения» (обязательно для Яндекса)

Независимо от того, какой протокол вы выберете (POP3 или IMAP), Яндекс больше не разрешает авторизоваться с помощью основного пароля от вашего аккаунта. Вам необходимо сгенерировать специальный защищенный пароль для 1С.

Выполним следующие шаги для создания пароля приложения:

  1. Авторизуйтесь в веб-интерфейсе вашей Яндекс.Почты под нужным аккаунтом.
  2. Перейдите в настройки аккаунта Яндекс ID (раздел «Безопасность» или по прямой ссылке

    id.yandex.ru

    ).
  3. Найдите раздел «Доступ к ящику» или «Пароли приложений».
  4. Нажмите кнопку «Создать пароль приложения».
  5. В качестве типа приложения выберите «Почта».
  6. Задайте имя для пароля (например, «Интеграция 1С»), чтобы вы всегда понимали, для чего он был создан.
  7. Яндекс сгенерирует уникальный 16-значный пароль (выглядит как набор случайных символов, например, abcd-efgh-ijkl-mnop). Скопируйте его.
  8. Вставьте этот скопированный пароль в код 1С в свойство Профиль.Пароль вместо вашего основного пароля.

Важное примечание: Пароль вводится без пробелов. Этот пароль предназначен исключительно для авторизации внешних почтовых клиентов и не может быть использован для входа в сам аккаунт через браузер, что существенно повышает безопасность вашей учетной записи.

Решение В. Проверка активации протоколов в настройках Яндекс.Почты

Даже если ваш код написан абсолютно верно, Яндекс может блокировать запросы от внешних почтовых программ, если соответствующие протоколы отключены в настройках самого почтового ящика.

Проверим доступность протоколов в веб-интерфейсе Яндекса:

  1. Откройте Яндекс.Почту в браузере.
  2. В правом верхнем углу нажмите на иконку «Шестеренка» (Настройки) -> «Все настройки».
  3. Выберите пункт меню «Почтовые программы».
  4. Убедитесь, что установлены флажки напротив пунктов:
    • «Разрешить доступ к почтовому ящику с помощью почтовых клиентов»
    • «С сервера imap.yandex.ru по протоколу IMAP» (рекомендуется)
    • Или «С сервера pop.yandex.ru по протоколу POP3» (если переход на IMAP по каким-то причинам невозможен)
  5. Нажмите кнопку «Сохранить изменения».

Решение Г. Очистка папки «Входящие» (для POP3)

Если вы вынуждены остаться на протоколе POP3, помните, что этот протокол по умолчанию пытается получить информацию обо всех письмах, находящихся в папке «Входящие» (Inbox). Если в вашем ящике накопились тысячи писем или присутствуют сообщения с вложениями объемом в десятки мегабайт, 1С гарантированно будет зависать на этапе вызова метода Get() из-за таймаута сокета.

Проанализируем следующие рекомендации по оптимизации ящика:

Решение Д. Конфигурирование локального антивируса и сетевого экрана

Часто причиной прерывания сессии (ошибки сокета с кодом 3) становится локальное защитное ПО (например, Kaspersky Internet Security). Эти программы перехватывают защищенный SSL-трафик на портах 995 (POP3) и 993 (IMAP) для его расшифровки и сканирования на вирусы «на лету».

Во время получения легких заголовков антивирус успевает пропустить пакеты, но при передаче больших потоков данных писем он задерживает трафик для анализа, что приводит к разрыву соединения по таймауту со стороны Яндекса.

Для устранения этой проблемы выполните следующие действия:

Решение Е. Обновление платформы 1С

Стоит упомянуть, что в старых релизах платформы 1С предприятия (особенно ветки 8.3.10 – 8.3.14) присутствовали внутренние ошибки платформенного парсера протокола POP3. При получении ответа от современных почтовых серверов, содержащего нестандартные заголовки или дополнительные служебные данные, парсер 1С аварийно завершал работу.

Если вы используете устаревший релиз платформы, рекомендуется обновить его до актуальной стабильной версии. Это решит возможные скрытые проблемы совместимости со спецификациями протоколов безопасности почтовых серверов.

← На главную