1

utl_mail.send() を使用してメールを送信していますが、カーソルを介して来る人の中には、メール アドレスがないか、無効なメールを持っている可能性があります。これらのヌル メールの 1 つに遭遇したときに、手順が爆撃されないようにするために使用できる例外を見つけるのに苦労しています。例:

.....

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;

わかりにくいかもしれませんが、何かありましたら質問してください。助けてくれてありがとう。

4

1 に答える 1

2

NULL の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;

whereLOG_EMAIL_FAILUREは単に障害をログ テーブルのどこかに書き込むロギング メソッドでありIS_VALID_EMAIL、電子メール アドレスが NULL であるかどうか、および有効に見えるかどうかをチェックするルーチンです (どれだけ詳しくしたいかによって、そこにはたくさんの正規表現があります)。 . たとえば、一時的な SMTP エラーと永続的な SMTP エラーを区別するためにコードをさらに複雑にするつもりでない限り、別の例外ハンドラを用意する必要はおそらくないでしょう。そしてもちろん、失敗した電子メールのテーブルを誰かが監視して、より体系的な問題 (つまり、SMTP サーバーがダウンしている) がないことを確認する必要があります。

于 2011-11-09T21:58:36.010 に答える