Untitled
unknown
plain_text
2 years ago
4.8 kB
14
Indexable
Процедура ОбработкаКодовОшибок(Рассылка, Адрес, ОписаниеОшибки, ПрерватьОтправку = Ложь) Экспорт
// Отбросим информацию о модуле, где возникла ошибка
ПозицияНачалаСообщения = СтрНайти(ОписаниеОшибки, ")}: ") + 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 сервера. Но письмо все равно не отправилось
Адрес.Статус = Перечисления.СтатусыПисем.ОшибкаОтправки;
Адрес.ДатаОтправки = ТекущаяДата();
КонецЕсли;
КонецПроцедурыEditor is loading...