有关utl_mail.send()的例外情况

时间:2011-11-09 21:45:46

标签: sql oracle exception plsql utl-mail

我正在使用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 个答案:

答案 0 :(得分:2)

如果UTL_MAIL.SEND为NULL,为什么要调用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服务器已关闭)。