Исключения относительно utl_mail.send () - PullRequest
0 голосов
/ 10 ноября 2011

Я отправляю электронные письма, используя utl_mail.send (), и возможно, что некоторые из людей, которые приходят через мой курсор, не будут иметь адреса электронной почты или будут иметь недопустимые электронные письма. У меня возникают проблемы с выяснением, какие исключения я могу использовать, чтобы убедиться, что моя процедура не выполняет бомбардировку при обнаружении одного из этих пустых электронных писем. Пример:

.....

procedure sendEmail                 --subroutine of my procedure
    BEGIN
        utl_mail.send(sender => email_from,
                  recipients => email_adr,
                  subject => email_subject,
                  mime_type => 'text/html',
                  message => email_body);

    --EXCEPTION SHOULD GO HERE

    END;


....
WHILE CURSOR%FOUND THEN
LOOP
    IF ..... THEN
        sendEmail;
    END IF;
....
END LOOP;

Это может сбивать с толку, но, если есть, задавайте вопросы. Спасибо за помощь.

1 Ответ

2 голосов
/ 10 ноября 2011

Зачем звонить 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-сервер).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...