我正在使用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;
这可能令人困惑,但如果您有任何疑问,请提出问题。谢谢你的帮助。
答案 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服务器已关闭)。