Untitled
plain_text
23 days ago
4.8 kB
6
Indexable
Never
Процедура ОбработкаКодовОшибок(Рассылка, Адрес, ОписаниеОшибки, ПрерватьОтправку = Ложь) Экспорт // Отбросим информацию о модуле, где возникла ошибка ПозицияНачалаСообщения = СтрНайти(ОписаниеОшибки, ")}: ") + 3; ОписаниеОшибки = Прав(ОписаниеОшибки,СтрДлина(ОписаниеОшибки) - ПозицияНачалаСообщения); Адрес.ОтветСервера = ОписаниеОшибки; // в ответ записываем текст ошибки в любом случае Если Не Рассылка.ТипПисьма = Перечисления.ТипыЭлектронныхПисем.Рассылка Тогда // Дальнейший анализ требуется только для рассылок Возврат; КонецЕсли; // получим код ошибки. На текущий момент, 24.03.2016, описание любой ошибки выглядит как "Код ошибки: 1." либо "Код ошибки: 25 (Отказ..." либо " (SMTP error code 451)". ПозицияКода = СтрНайти(ОписаниеОшибки, "Код ошибки: ")+12; Если ПозицияКода = 12 Тогда ПозицияКода = СтрНайти(ОписаниеОшибки, "error code ")+10; Если ПозицияКода = 10 Тогда Возврат; // Произошла ошибка не smtp сервера. Выходим. Иначе ОкончаниеКода = СтрНайти(ОписаниеОшибки, ")",,ПозицияКода); Код = Сред(ОписаниеОшибки, ПозицияКода,ОкончаниеКода - ПозицияКода); КонецЕсли; Иначе ОкончаниеКода = СтрНайти(ОписаниеОшибки, ".",,ПозицияКода); Если ОкончаниеКода = 0 Или ОкончаниеКода - ПозицияКода > 3 Тогда ОкончаниеКода = СтрНайти(ОписаниеОшибки, "(",,ПозицияКода); КонецЕсли; Код = Сред(ОписаниеОшибки, ПозицияКода, ОкончаниеКода - ПозицияКода); КонецЕсли; Код = СокрЛП(Код); // Коды ошибок, при которых следует прерывать рассылку и сделать уведомление Если Код = "1" ИЛИ Код = "25" ИЛИ Код = "535" ИЛИ Код = "534" ИЛИ Код = "554" Тогда Рассылка.Статус = Перечисления.СтатусРассылок.АварийноЗавершена; Адрес.Статус = Перечисления.СтатусыПисем.АварийноЗавершено; Адрес.ДатаОтправки = ТекущаяДата(); ПрерватьОтправку = Истина; Попытка ЕМайлУведомления.ОтправитьУведомлениеОбАварийномЗавершенииРассылки(Рассылка.Ссылка); Исключение ЗаписьЖурналаРегистрации("Не удалось отправить уведомление об аварийном завершении рассылки", УровеньЖурналаРегистрации.Ошибка, Метаданные.Справочники.ЭлектронныеПисьма, "Код: " + Рассылка.Код, ОписаниеОшибки); КонецПопытки; // Коды ошибок, при которых нужно пропустить текущий адрес и работать дальше ИначеЕсли Код = "501" ИЛИ Код = "550" Тогда Адрес.Статус = Перечисления.СтатусыПисем.ОшибкаОтправки; Адрес.ДатаОтправки = ТекущаяДата(); // Коды ошибок, которые связаны с временным отказом сервера ИначеЕсли Код = "451" Тогда Адрес.Статус = Перечисления.СтатусыПисем.Отправляется; ПрерватьОтправку = Истина; Иначе // Произошла ошибка не smtp сервера. Но письмо все равно не отправилось Адрес.Статус = Перечисления.СтатусыПисем.ОшибкаОтправки; Адрес.ДатаОтправки = ТекущаяДата(); КонецЕсли; КонецПроцедуры