1. Johney20 10.07.18 09:15 Сейчас в теме

Повтор отправки сообщений при ошибке.

Добрый день!

Есть обработка, которая проверят актуальность копий ИБ. Есть механизм автоматического оповещения о прекращении работы копии. Оповещения отправляются по почте владельцу копии.

Необходимо при ошибке отправки сообщения, повторять отправку, пока сообщение не отправится.

Отправка помещена в попытку, конечно.

Попытка
		Результат = Почта.Послать(Сообщение);
	Исключение
		Текст = НСтр("ru = 'Не удалось отправить письмо через профиль! Пользователь: ""ПользовательПочты "", сервер исходящей почты: ""АдресСервераSMTP""! Причина:
                      |%ОписаниеОшибки%'");
		Текст = СтрЗаменить(Текст, "%ПользовательПочты%", Строка(ПараметрыУчетнойЗаписи.Пользователь));
		Текст = СтрЗаменить(Текст, "%АдресСервераSMTP%", ПараметрыУчетнойЗаписи.СерверИсходящейПочтыSMTP);
		Текст = СтрЗаменить(Текст, "%ОписаниеОшибки%", ОписаниеОшибки());
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст);
	КонецПопытки;

Показать


Как работает механизм повторной отправки? Что нужно добавить??
Ответы
Сортировка: Древо
2. АлександрЯрославичъ 10.07.18 09:27 Сейчас в теме
Может записывать неудачно отправленные в регистр, а потом с помощью рег.задания неудачно отправленные по новой пытаться отправить?
3. Johney20 10.07.18 09:31 Сейчас в теме
(2) Не совсем подходит. Это нужно создавать новый регистр, новое РЗ, слишком много согласований получится для создания новых объектов. Должен быть способ попроще..
4. MamatovIA 10.07.18 09:37 Сейчас в теме
А если сделать так?
Пока Истина цикл
Попытка
        Результат = Почта.Послать(Сообщение);
    Исключение
        Текст = НСтр("ru = 'Не удалось отправить письмо через профиль! Пользователь: ""ПользовательПочты "", сервер исходящей почты: ""АдресСервераSMTP""! Причина:
                      |%ОписаниеОшибки%'");
        Текст = СтрЗаменить(Текст, "%ПользовательПочты%", Строка(ПараметрыУчетнойЗаписи.Пользователь));
        Текст = СтрЗаменить(Текст, "%АдресСервераSMTP%", ПараметрыУчетнойЗаписи.СерверИсходящейПочтыSMTP);
        Текст = СтрЗаменить(Текст, "%ОписаниеОшибки%", ОписаниеОшибки());
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст);
        Продолжить;
    КонецПопытки;
Прервать;
КонецЦикла;
Показать
5. Johney20 10.07.18 09:42 Сейчас в теме
(4) Мм.. Оператор "Прервать" выйдет из цикла после удачной отправки?? Не зациклится?
6. MamatovIA 10.07.18 09:44 Сейчас в теме
(5)Да, должен выйти.
Если сообщение отправится, то блок Исключение не сработает. Следующий оператор будет Прервать.
12. Johney20 10.07.18 10:29 Сейчас в теме
(6) Да, это пойдет, если только добавить счетчик. А то в случае, например, если упадет почтовый сервер, то отправка сообщений просто зациклится бесконечно и все.
7. qazaas 10.07.18 09:49 Сейчас в теме
(5) Хм...
Если вас предложенный метод устраивает, но вы опасаетесь за вечный цикл, тогда сделайте с меткой, типа так:

~ОтправкаСообщения:
Попытка
        Результат = Почта.Послать(Сообщение);
    Исключение
        Текст = НСтр("ru = 'Не удалось отправить письмо через профиль! Пользователь: ""ПользовательПочты "", сервер исходящей почты: ""АдресСервераSMTP""! Причина:
                      |%ОписаниеОшибки%'");
        Текст = СтрЗаменить(Текст, "%ПользовательПочты%", Строка(ПараметрыУчетнойЗаписи.Пользователь));
        Текст = СтрЗаменить(Текст, "%АдресСервераSMTP%", ПараметрыУчетнойЗаписи.СерверИсходящейПочтыSMTP);
        Текст = СтрЗаменить(Текст, "%ОписаниеОшибки%", ОписаниеОшибки());
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст);
Перейти ~ОтправкаСообщения;
    КонецПопытки;
Показать


Что-то типа такого...
8. herfis 261 10.07.18 09:54 Сейчас в теме
Я бы просто сделал это фоновым заданием, в нем тупо падал по исключению (т.е. просто пытался отправить без всяких Попытка/исключение), для фонового бы настроил штатные повторы при сбоях. Но лог отправок и ошибок при отправке все равно какой-то отдельный нужен. Можно просто в текстовый файлик писать. Потом его можно анализировать автоматически и выдавать нужным людям предупреждения в 1С, что почта или системные рассылки отвалились.
9. herfis 261 10.07.18 10:03 Сейчас в теме
Хотя, если в лог писать, то "Попытка" таки нужна.
Тогда так:
Попытка
        Результат = Почта.Послать(Сообщение);
        // запись в лог об успешной отправке
        ........
Исключение
        // запись в лог об ошибке отправки
        ........
        ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
Показать
10. necropunk 5 10.07.18 10:07 Сейчас в теме
Я делаю переменную выхода, а сам цикл Пока Сч = 1 По 5.
То есть, если отправилось - ок. Если не отправилось - пять попыток, потом хорош, значит проблема глобальная, долбиться смысла нет.
11. Johney20 10.07.18 10:28 Сейчас в теме
(10) Вот, это логично! Спасибо!
13. herfis 261 10.07.18 10:57 Сейчас в теме
А в фоновом задании даже кодить не надо - там количество повторов при сбоях параметрически настраивается :)
14. user633533_encantado 2 10.07.18 11:15 Сейчас в теме
Суть в том, что метод Послать() не всегда даст исключение, если не удалось послать почту.
После какой-то версии платформы он стал возвращать соответствие с результатом отправки. Вот его и надо анализировать.
15. herfis 261 10.07.18 11:29 Сейчас в теме
(14) Таки да. С 8.3.9
У меня до сих пор 8.3.6 :)
16. kadild 12.07.18 10:53 Сейчас в теме
Ну так оберните весь ваш код в функцию в возвратом параметра удачной отправки и вызывайте его пока не останетесь довольны. В чем проблема-то?
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Удаленный консультант-разработчик 1С
Краснодар
зарплата от 60 000 руб. до 60 000 руб.
Полный день



Ведущий программист 1С
Москва
зарплата от 150 000 руб. до 180 000 руб.
Полный день

Руководитель проектов 1С
Москва
Полный день