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С
Казань
Полный день

Программист 1С
Санкт-Петербург
зарплата от 130 000 руб. до 150 000 руб.
Полный день

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

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

Программист 1С
Нижний Новгород
зарплата от 120 000 руб.
Полный день