Untitled

mail@pastecode.io avatarunknown
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 сервера. Но письмо все равно не отправилось
		Адрес.Статус 		= Перечисления.СтатусыПисем.ОшибкаОтправки;
		Адрес.ДатаОтправки 	= ТекущаяДата();
		
	КонецЕсли;
	
КонецПроцедуры