Зачем звонить UTL_MAIL.SEND
, если EMAIL_ADR
НЕДЕЙСТВИТЕЛЕН?Почему бы просто не проверить адрес электронной почты, прежде чем пытаться отправить письмо, например:
BEGIN
IF( email_adr IS NOT NULL )
THEN
utl_mail.send ...
END IF;
END;
Поскольку звучит так, как будто вы согласны с тем, что какое-либо конкретное письмо не работает по любой причине, по которому оно не работает, у меня возникнет соблазнпросто перехватите все исключения и запишите их в таблицу исключений, например,
PROCEDURE send_email
AS
l_error_code NUMBER;
l_error_message VARCHAR2(255);
BEGIN
IF( is_valid_email( email_adr ) )
THEN
utl_mail.send ...
END IF;
EXCEPTION
WHEN others THEN
l_error_code := SQLCODE;
l_error_message := SQLERRM;
log_email_failure( email_from,
email_adr,
email_subject,
email_body,
l_error_code,
l_error_message );
END;
, где LOG_EMAIL_FAILURE
- это просто метод ведения журнала, который записывает ошибки в таблицу журналов, а IS_VALID_EMAIL
- это процедура, проверяющая,адрес электронной почты равен NULL, и если он кажется действительным (существует множество регулярных выражений в зависимости от того, какой педантичностью вы хотите быть).Если вы не собираетесь делать код намного более сложным, чтобы попытаться провести различие между, скажем, временными ошибками SMTP и постоянными ошибками SMTP, вероятно, нет необходимости иметь отдельные обработчики исключений.И, конечно, кто-то должен будет следить за таблицей неудачных сообщений, чтобы убедиться, что нет более системной проблемы (т. Е. Не работает SMTP-сервер).