1

我正在使用 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;

这可能会令人困惑,但如果您有任何问题,请提出问题。谢谢您的帮助。

4

1 回答 1

2

为什么要调用UTL_MAIL.SENDifEMAIL_ADR为 NULL?为什么不在尝试发送电子邮件之前简单地检查电子邮件地址,即

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 回答