ИнтернетПочта

Типы

Синтаксис и применение ИнтернетПочта в платформе 1С:Предприятие. Описание и примеры кода.

Полное описание, параметры и ограничения

ИнтернетПочта

ИнтернетПочта
Интернет почта позволяет создавать письмо, прикреплять к нему файлы, редактировать пришедшие и вновь созданные письма, указывать получателей, копии, слепые копии и т.д.
Интернет почта не зависит от установленного почтового клиента.
Методическая информация

Практические примеры

Прочитать своё IMAP-письмо без удаления и отметки прочтения

Полный учебный модуль для отдельного локального почтового стенда: реальные IMAP/SMTP-контракты, свои сообщения/UID/папки и проверяемые эффекты. В ходе подготовки справочника почта и сеть не выполняются.

Где и как запускать

Полный клиентский общий модуль УчебнаяПочта85, толстое управляемое Windows-приложение; собственный loopback-сервер и отдельный полный модуль формы вызова.

Подготовка

  1. Новая пустая конфигурация УчебнаяПочта85, платформа8.5.1.1343, управляемое приложение и именно толстый Windows-клиент. Учебный клиент и отдельный тестовый почтовый сервер на одной машине; рабочие почтовые профили не используются.

  2. Установленный ИнтернетПочта использует SMTP/POP3/IMAP, не MAPI. Нативная справка прямо говорит: SSL есть, проверки сертификата клиента/сервера нет. Код этого урока не выдаётся за защищённую production-интеграцию.

  3. Ваш собственный локальный сервер слушает только127.0.0.1:1143(IMAP) и127.0.0.1:1025(SMTP). Исходящая доставка/relay/DNS и внешние подключения запрещены настройкой сервера; SMTP только принимает в вашу локальную тестовую очередь.

  4. Создайте нового отдельного пользователя lab85 с собственным ASCII-паролем не более64 символов и отдельной почтовой областью. IMAP поддерживает hierarchy с выбираемыми родительскими папками, UIDPLUS, Flagged/Deleted/Seen и обычную тестовую аутентификацию; SMTP поддерживает AUTH LOGIN для lab85.

  5. Локальная модель намеренно допускает обычную аутентификацию; это не шифрование и не безопасный рецепт для LAN/интернета. Настройка SSLIMAP устанавливается до нестандартного порта1143, потому что смена SSL-флага меняет порт по умолчанию.

  6. Только один клиент/автор и никакие параллельные доставщики. Квота тестового пользователя не более1МиБ, каждое учебное письмо не более4КиБ. Нет чужих сообщений, ссылок на реальные вложения и рабочих папок.

  7. Для первого урока вручную подготовьте папку LAB85_Read с ровно одним письмом: тема MAIL-LAB85-READ, простой текст MAIL-LAB85, без вложений, нечастичное, без Deleted. Этот исходный образец не удаляется.

  8. Для второго и четвёртого урока новые пространства LAB85_UUID/LAB85_MERGE_UUID создаёт только сам учебный код. IMAP-перенос требует UIDPLUS. INBOX используется только как место выхода из своей папки: его письма не выбираются, не помечаются и не очищаются.

  9. Общие → Общие модули → УчебнаяПочта85: Клиент(управляемое приложение)=Истина, Сервер/ВызовСервера/Глобальный/Привилегированный/ВнешнееСоединение=Ложь, повторное использование выключено. Основной полный модуль одного урока вставляется целиком, одноимённые функции не склеиваются.

  10. Обработки → ЗапускПочты85 → управляемая форма Форма: СогласенНаЛокальнуюПочту85 и Занято85 Булево исходно Ложь; ПарольУчебнойПочты85 Строка, Итог85 Строка неограниченной длины только для просмотра. Пароль не сохраняйте в настройках/истории; включите скрытое отображение поля в редакторе формы.

  11. Отдельный полный модуль формы — дополнительный блок. Команда ВыполнитьПочту85 назначается кнопке, Действие=ВыполнитьПочту85, вызывает клиентский УчебнаяПочта85.ВыполнитьПример85(согласие,пароль); после успеха/ошибки реквизит пароля очищается.

  12. F7 и обновление только своего стенда. Сначала читающий урок, затем собственный цикл IMAP, затем SMTP и MIME. Разрешение на каждый будущий ручной сетевой опыт отдельно; здесь его выполнения нет.

  13. У MIME-урока две ASCII-части message/partial создаются из настоящих исходных MIME-байтов и разбираются УстановитьИсходныеДанные; в собственную папку добавляются по IMAP. Номера1/2, общий id, total2, 7bit и разрыв по CRLF соответствуют RFC2046 §5.2.2: https://www.rfc-editor.org/rfc/rfc2046.html#section-5.2.2 .

  14. runtimeVerifiedScenarios=0:1С/серверы/GUI не запускались, реальная почта и сеть не вызывались, сообщения не отправлялись/удалялись и новые резервные копии/архивы не создавались. Приведённые эффекты относятся только к будущему отдельно разрешённому ручному выполнению.

Функция ВыполнитьПример85(Согласие, Пароль) Экспорт
    Если Не Согласие Тогда
        ВызватьИсключение "Нужен свой локальный изолированный почтовый стенд УчебнаяПочта85 и согласие";
    КонецЕсли;
    Если ТипЗнч(Пароль) <> Тип("Строка") Или СтрДлина(Пароль) = 0 Или СтрДлина(Пароль) > 64 Тогда
        ВызватьИсключение "Нужен отдельный ASCII-пароль своего локального тестового пользователя";
    КонецЕсли;
    Почта = Неопределено;
    Попытка
        Почта = Новый ИнтернетПочта;
        Почта.Подключиться(СвойПрофиль85(Пароль, Ложь), ПротоколИнтернетПочты.IMAP);
        Если Почта.ПолучитьПочтовыеЯщики().Найти("LAB85_Read") = Неопределено Тогда
            ВызватьИсключение "Нет своей вручную подготовленной папки LAB85_Read";
        КонецЕсли;
        Почта.ТекущийПочтовыйЯщик = "LAB85_Read";
        Если Почта.ТекущийПочтовыйЯщик <> "LAB85_Read" Или Почта.ПолучитьКоличествоСообщений() <> 1 Тогда
            ВызватьИсключение "Нужна собственная папка с одним подготовленным письмом";
        КонецЕсли;
        Идентификаторы = Почта.ПолучитьИдентификаторы(Новый Массив);
        Если Идентификаторы.Количество() <> 1 Тогда
            ВызватьИсключение "Нет ровно одного настоящего UID; пустой отбор не передаётся Выбрать";
        КонецЕсли;
        ФлагиДо = СвоиФлаги85(Почта, Идентификаторы);
        Если ФлагиДо.Удаленное Тогда
            ВызватьИсключение "Подготовленное своё письмо не должно быть помечено Deleted";
        КонецЕсли;
        Заголовки = Почта.ПолучитьЗаголовки(Новый Структура("Тема", "MAIL-LAB85-READ"));
        Если Заголовки.Количество() <> 1 Тогда
            ВызватьИсключение "Ожидается один свой заголовок; пустой массив не означает выбрать ничего";
        КонецЕсли;
        Заголовок = Заголовки[0];
        Если ТипЗнч(Заголовок) <> Тип("ИнтернетПочтовоеСообщение") Или Заголовок.Тема <> "MAIL-LAB85-READ"
            Или Заголовок.Размер < 1 Или Заголовок.Размер > 4096 Тогда
            ВызватьИсключение "Свой заголовок и малый размер не подтверждены";
        КонецЕсли;
        Письмо = ПроверитьСвоёПисьмо85(Почта, Идентификаторы, "MAIL-LAB85-READ", "MAIL-LAB85");
        ФлагиПосле = СвоиФлаги85(Почта, Идентификаторы);
        Если ФлагиПосле.Удаленное <> ФлагиДо.Удаленное Или ФлагиПосле.Прочитанное <> ФлагиДо.Прочитанное
            Или Почта.ПолучитьКоличествоСообщений() <> 1 Тогда
            ВызватьИсключение "Непрочитанный/неудалённый статус или количество изменились";
        КонецЕсли;
        Итог = "Получен реальный заголовок и своё полное письмо: " + Письмо.Тема
            + "; тело=" + СокрЛП(Письмо.Тексты.Получить(0).Текст) + "; удаление и отметка прочтения не запрашивались.";
        Почта.Отключиться();
        Почта = Неопределено;
        Возврат Итог;
    Исключение
        ЗакрытьПослеОшибки85(Почта);
        ВызватьИсключение "Чтение своего локального письма не подтверждено; никаких удалений или повторной выборки всех писем нет.";
    КонецПопытки;
КонецФункции

Функция СвойПрофиль85(Пароль, ДляSMTP)
    Профиль = Новый ИнтернетПочтовыйПрофиль;
    Профиль.АдресСервераPOP3 = "";
    Профиль.АдресСервераIMAP = "";
    Профиль.АдресСервераSMTP = "";
    Профиль.Таймаут = 15;
    Если ДляSMTP Тогда
        Профиль.ИспользоватьSSLSMTP = Ложь;
        Профиль.АдресСервераSMTP = "127.0.0.1";
        Профиль.ПортSMTP = 1025;
        Профиль.ПользовательSMTP = "lab85";
        Профиль.ПарольSMTP = Пароль;
        Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
        Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Ложь;
    Иначе
        Профиль.ИспользоватьSSLIMAP = Ложь;
        Профиль.АдресСервераIMAP = "127.0.0.1";
        Профиль.ПортIMAP = 1143;
        Профиль.ПользовательIMAP = "lab85";
        Профиль.ПарольIMAP = Пароль;
        Профиль.ТолькоЗащищеннаяАутентификацияIMAP = Ложь;
    КонецЕсли;
    Возврат Профиль;
КонецФункции

Процедура ЗакрытьПослеОшибки85(Почта)
    Если Почта <> Неопределено Тогда
        Попытка
            Почта.Отключиться();
        Исключение
            ВызватьИсключение "Опыт и отключение не подтверждены; проверьте только свой локальный сервер. Сырые ошибки и пароль не выводятся.";
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

Функция ПроверитьСвоёПисьмо85(Почта, Идентификаторы, Тема, Тело)
    Если ТипЗнч(Идентификаторы) <> Тип("Массив") Тогда
        ВызватьИсключение "Нужен настоящий массив серверных идентификаторов";
    КонецЕсли;
    Если Идентификаторы.Количество() <> 1 Или Почта.ПолучитьКоличествоСообщений() <> 1 Тогда
        ВызватьИсключение "Нужно ровно одно своё сообщение; пустой отбор запрещён";
    КонецЕсли;
    Письма = Почта.Выбрать(Ложь, Идентификаторы, Ложь);
    Если Письма.Количество() <> 1 Тогда
        ВызватьИсключение "Получено не одно ожидаемое своё письмо";
    КонецЕсли;
    Письмо = Письма[0];
    Если ТипЗнч(Письмо) <> Тип("ИнтернетПочтовоеСообщение") Тогда
        ВызватьИсключение "Нужен настоящий результат почтового получения";
    КонецЕсли;
    Если Письмо.Идентификатор.Количество() <> 1 Тогда
        ВызватьИсключение "Нужно одно нечастичное письмо с одним серверным UID";
    КонецЕсли;
    Если Письмо.Идентификатор[0] <> Идентификаторы[0] Или Письмо.Частичное
        Или Письмо.Тема <> Тема Или Письмо.Тексты.Количество() <> 1 Или Письмо.Вложения.Количество() <> 0 Тогда
        ВызватьИсключение "UID, тема, вид или состав своего сообщения не подтверждены";
    КонецЕсли;
    Если СокрЛП(Письмо.Тексты.Получить(0).Текст) <> Тело Тогда
        ВызватьИсключение "Нормализованный текст не содержит ровно свой ожидаемый маркер";
    КонецЕсли;
    Возврат Письмо;
КонецФункции

Функция СвоиФлаги85(Почта, Идентификаторы)
    Если Идентификаторы.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен один настоящий UID своей текущей папки";
    КонецЕсли;
    Карта = Почта.ПолучитьФлагиСообщений(Идентификаторы);
    Если ТипЗнч(Карта) <> Тип("Соответствие") Тогда
        ВызватьИсключение "Флаги должны вернуться настоящим соответствием UID–объект";
    КонецЕсли;
    Флаги = Карта.Получить(Идентификаторы[0]);
    Если ТипЗнч(Флаги) <> Тип("ФлагиИнтернетПочтовогоСообщения") Тогда
        ВызватьИсключение "Сервер не вернул флаги для своего UID";
    КонецЕсли;
    Если ТипЗнч(Флаги.Помеченное) <> Тип("Булево") Или ТипЗнч(Флаги.Удаленное) <> Тип("Булево") Тогда
        ВызватьИсключение "Учебный сервер должен явно поддерживать Flagged и Deleted";
    КонецЕсли;
    Возврат Флаги;
КонецФункции
Управляемая команда локального почтового опыта

УчебнаяПочта85 → Обработки → ЗапускПочты85 → Формы → Форма → Модуль

Полный модуль своей формы: команда ВыполнитьПочту85, Действие=ВыполнитьПочту85; согласие и отдельный пароль передаются клиентскому общему модулю.

&НаКлиенте
Процедура ВыполнитьПочту85(Команда)
    Если Не СогласенНаЛокальнуюПочту85 Или Занято85 Тогда
        ВызватьИсключение "Нужно отдельное согласие на свой локальный почтовый опыт";
    КонецЕсли;
    Занято85 = Истина;
    Попытка
        Итог85 = УчебнаяПочта85.ВыполнитьПример85(СогласенНаЛокальнуюПочту85, ПарольУчебнойПочты85);
    Исключение
        ПарольУчебнойПочты85 = "";
        Занято85 = Ложь;
        Итог85 = "Опыт не подтверждён. Проверьте только свой локальный стенд; подробности с учётными данными не отображаются.";
        ВызватьИсключение "Локальный почтовый опыт не завершён";
    КонецПопытки;
    ПарольУчебнойПочты85 = "";
    Занято85 = Ложь;
КонецПроцедуры

Разбор по шагам

  1. Проверяются свой стенд/версия/согласие и локальный пароль, создаётся настоящий IMAP-профиль.

  2. Выбирается только собственная LAB85_Read с одним подготовленным письмом, не рабочий INBOX.

  3. Настоящие UID и флаги получают с сервера, пустой отбор запрещается до Выбрать.

  4. ПолучитьЗаголовки фильтрует собственную тему; проверяются тип, тема и малый размер, заголовок не считается телом.

  5. Выбрать(Ложь,UID,Ложь) получает полное письмо, проверяет серверную идентичность и нормализованный свой текст.

  6. Deleted/Seen и количество перечитываются, чтобы не заявлять сохранность только по намерению вызова.

  7. Сессия отключается, безопасный итог содержит свой текст, пароль не показывается.

Как проверить результат

  1. Папка LAB85_Read содержит ровно один настоящий UID.

  2. Заголовок и полное письмо подтверждают тему MAIL-LAB85-READ.

  3. Полный текст MAIL-LAB85, вложений нет.

  4. Количество/Deleted/Seen после чтения не изменились.

  5. Нет вызова удаления, отправки или отметки прочтения; сессия отключается.

Ожидаемый результат

Ожидаемые результаты относятся к будущему отдельно разрешённому ручному опыту. Реальная1С/почта/сеть не запускались, runtimeVerifiedScenarios=0.

На что обратить внимание

  1. Выбрать() по умолчанию удаляет сообщения. Для чтения указаны Ложь и Ложь: не удалять и не отмечать прочитанными. Последний флаг актуален для IMAP, для POP3 допустима только Истина.

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

  3. Фильтр ПолучитьЗаголовки/ПолучитьИдентификаторы действует только IMAP; POP3 игнорирует его. Неизвестный ключ фильтра тоже может игнорироваться. Читающая папка содержит ровно один собственный проверяемый образец.

  4. ПолучитьЗаголовки возвращает ограниченный набор полей: тело/вложения ещё не получены. Полное письмо отдельно загружается по настоящему UID и проверяется по теме, составу и нормализованному простому тексту.

  5. UID уникален в пределах папки, не всей системы. После переноса или переименования код снова получает реальные идентификаторы, не использует порядковый номер строки или старый UID другого ящика.

  6. СимволРазделитель получен от своего сервера, не жёстко задан /. Иерархия создаётся только внутри своего случайного корня; сервер без подходящей иерархии не объявляется совместимым.

  7. Подписка и выбор текущей папки — разные действия. Список подписанных имён проверяется после подписки и отмены; изменение подписки не отправляет письмо.

  8. Послать(...,IMAP) добавляет сообщение в текущую папку IMAP, это не SMTP-доставка получателю. SMTP-урок отдельно использует SMTP и локальную тестовую очередь.

  9. Послать возвращает Соответствие отказов получателей. Пустое соответствие означает принятие на этом этапе, не подтверждение окончательной доставки или прочтения; исключение не разрешает слепой повтор отправки.

  10. SSL-флаг/ТолькоЗащищеннаяАутентификация не доказывает проверку сертификата. Нативный ИнтернетПочта этого не предоставляет; профиль данного урока допускается только на отдельном loopback-стенде без реальных секретов.

  11. АутентификацияSMTP/СпособSMTPАутентификации.Login устарели и не рекомендуются с8.3.1. Здесь они явно показывают контракт отдельного тестового AUTH LOGIN в толстом клиенте; это не рекомендация для новой production-интеграции.

  12. УстановитьФлагиСообщений принимает соответствие UID→ФлагиИнтернетПочтовогоСообщения, не массив UID. Истина ставит, Ложь снимает, Неопределено оставляет флаг; неподдерживаемый флаг сервер может проигнорировать.

  13. Урок меняет Flagged в реально полученном объекте флагов, перечитывает результат и требует поддержку Flagged/Deleted. Снимок других флагов не атомарен; поэтому нет сторонних клиентов и доставщиков.

  14. УдалитьСообщения при IMAP сначала ставит Deleted, ОтменитьУдалениеСообщений снимает пометку, ОчиститьУдаленныеСообщения удаляет ВСЕ Deleted текущей папки. Очистка разрешена только в своей папке с одним подтверждённым собственным письмом.

  15. УдалитьПочтовыйЯщик удаляет папку со всем содержимым. Второй урок удаляет лишь свои проверенные пустые папки; MIME-урок — только свою папку с двумя подтверждёнными UID. Восстановление/корзина не обещаются.

  16. ПереместитьВПочтовыйЯщик требует UIDPLUS и существующую собственную папку. При ошибке/частичном эффекте код ничего не удаляет и не повторяет автоматически; проверьте своё пространство вручную.

  17. message/partial — не multipart/mixed и не вручную установленный readonly-флаг Частичное. Две реально разобранные части имеют общий MIME-id, но разные Message-ID и настоящие UID своей папки.

  18. ОбъединитьЧастичные работает с реальными полученными объектами в RAM: неполный набор остаётся частичным, полный набор проверяется по двум строкам и двум настоящим UID. Это не серверное объединение писем.

  19. Нормализация текста допускает только обычные конечные пробелы/переводы строк данного маленького ASCII-образца. Это не проверка произвольного бинарного вложения и не лимит потока получения; квота и неизменяемый тестовый сервер обязательны.

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

  21. Отключиться закрывает сессию, но не является откатом отправки, перемещения, пометок или удаления. После сбоя фактическое состояние проверяется только на своём сервере.

  22. 1С/SMTP/IMAP не запускались: runtimeVerifiedScenarios=0. Статические тесты проверяют контракт и код, не фактическое поведение конкретного почтового сервера.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.