发布网友 发布时间:2022-04-08 21:52
共1个回答
热心网友 时间:2022-04-08 23:21
(注释:如果你的应用程序使构建在Oracle 8i的基础之上,前提是运行维护在Oracle 10g或以上版本,那么你也可以通过旧的utl_smtp工具包来发送电子邮件。) utl_smtp代码的一个优点就是可以在Oracle 10g上正常运行,所以我们不需要用utl_mail来替代utl_smtp工具包。虽然utl_mail完全替代utl_smtp的一天勿庸置疑会降临,不过现在utl_smtp还能够满足我们的需求。 首先,确认utl_smtp工具包已经安装在你的系统里(当然是在SYS架构里)。如果你还没有安装这个工具包,可以在你的ORACLE_HOME\RDBMS\admin文件夹中找到utlsmtp.sql脚本。你还需要utl_tcp包;同样的,如果你发现utl_tcp包还没有加载,也可以从跟utlsmtp.sql脚本相同的路径找到utltcp.sql脚本。最后,你还需要知道你的企业SMTP服务器的URL。(注意,下面的例子不适用于对SMTP进行了安全设置的服务器,如Gmail) 程序包说明语句: 以下是引用片段: create or replace PACKAGE sendmail IS procere send (p_sender varchar2, p_recipient varchar2, p_subject varchar2, p_body varchar2 default null); end sendmail;仔细观察以上语句的主体和下面的程序包,你可能会发现send的公共模式(public method)依赖于被称为common的私有模式(private method),这样以后我们可以对这个程序包进行扩展,并为大家展示怎样发送二进制大对象(blob)附件。例如,如果你生成了一份PDF文档,并把它保存在你的数据库里,你可以会想要把它作为电子邮件的附件发送出去, common模式就是用来完成这个任务的。将要用到的代码来自于基本send模式和send_blob模式。 以下就是程序包的主体: 以下是引用片段: create or replace PACKAGE BODY sendmail IS procere common (p_sender varchar2, p_recipient varchar2, p_subject varchar2, c out utl_smtp.connection) is v_recipient varchar2(1000); begin --make connection to smtp c := utl_smtp.open_connection('smtp.example.com'); --identify the domain of the sender utl_smtp.helo(c, 'example.com'); --start a mail, specify the sender utl_smtp.mail(c, p_sender); --identify recipient utl_smtp.rcpt(c, v_recipient); --start the mail body utl_smtp.open_data(c); utl_smtp.write_data(c, 'From: ' || p_sender || utl_tcp.crlf); utl_smtp.write_data(c, 'To: ' || p_recipient || utl_tcp.crlf); utl_smtp.write_data(c, 'Subject: ' || p_subject || utl_tcp.crlf); exception when utl_smtp.transient_error or utl_smtp.permanent_error then utl_smtp.quit(c); raise; when others then raise; end common; procere send (p_sender varchar2, p_recipient varchar2, p_subject varchar2, p_body varchar2 default null) is c utl_smtp.connection; begin common(p_sender, p_recipient, p_subject, c); utl_smtp.write_data(c, 'Content-Type: text/html' || utl_tcp.crlf); utl_smtp.write_data(c, utl_tcp.crlf || p_body); utl_smtp.close_data(c); utl_smtp.quit(c); exception when utl_smtp.transient_error or utl_smtp.permanent_error then utl_smtp.quit(c); raise; when others then raise; end send; end sendmail;