10G之前,如果要从oracle中发送email,必须借助oracle的utl_smtp和utl_tcp功能包,自己包装一个email发送程序,然后使用。自从10G后,这个流程将变得非常简单。因为oracle给我们提供了一个utl_mail包,我们可以直接调用发送email。其实这个包底层也是调用了utl_smtp、utl_tcp的相关api。 不过utl_mail只能用于无安全验证的smtp服务器。如果smtp服务器需要安全验证,只能用utl_smtp来实现。
武强ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联建站的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!
1、确定是否安装了utl_mail,如果没有用下面的语句安装utl_mail
@%ORACLE_HOME%\rdbms\admin\utlmail.sql
@%ORACLE_HOME%\rdbms\admin\prvtmail.plb
2、设置smtp_out_server参数
10g中oracle新增加了这个参数用来定义smtp服务器。如果该参数没有设置,oracle会自动解析db_domain 参数,用域名来实现mail的发送,没有db_domain也没有设置,那么mail将不会成功发送。建议设置smtp_out_server参数:
alter system set smtp_out_server = 'smtp.chengmail.cn';
如果要同时设置多个smtp服务器,可以将各个服务器用逗号隔开:
alter system set smtp_out_server = 'smtp.chengmail.cn, mail.a.com';
上面的域名也可以用ip来代替,oracle默认会使用25端口来发送,也可以手动指定具体的端口:
alter system set smtp_out_server = 'smtp.chengmail.cn:25, mail.a.com:25';
3、测试邮件发送
目前utl_mail提供了三个发送邮件的过程
PROCEDURE SEND
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
SENDER VARCHAR2 IN
RECIPIENTS VARCHAR2 IN
CC VARCHAR2 IN DEFAULT
BCC VARCHAR2 IN DEFAULT
SUBJECT VARCHAR2 IN DEFAULT
MESSAGE VARCHAR2 IN DEFAULT
MIME_TYPE VARCHAR2 IN DEFAULT
PRIORITY BINARY_INTEGER IN DEFAULT
REPLYTO VARCHAR2 IN DEFAULT
PROCEDURE SEND_ATTACH_RAW
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
SENDER VARCHAR2 IN
RECIPIENTS VARCHAR2 IN
CC VARCHAR2 IN DEFAULT
BCC VARCHAR2 IN DEFAULT
SUBJECT VARCHAR2 IN DEFAULT
MESSAGE VARCHAR2 IN DEFAULT
MIME_TYPE VARCHAR2 IN DEFAULT
PRIORITY BINARY_INTEGER IN DEFAULT
ATTACHMENT RAW IN
ATT_INLINE BOOLEAN IN DEFAULT
ATT_MIME_TYPE VARCHAR2 IN DEFAULT
ATT_FILENAME VARCHAR2 IN DEFAULT
REPLYTO VARCHAR2 IN DEFAULT
PROCEDURE SEND_ATTACH_VARCHAR2
参数名称 类型 输入/输出默认值?
------------------------------ ----------------------- ------ --------
SENDER VARCHAR2 IN
RECIPIENTS VARCHAR2 IN
CC VARCHAR2 IN DEFAULT
BCC VARCHAR2 IN DEFAULT
SUBJECT VARCHAR2 IN DEFAULT
MESSAGE VARCHAR2 IN DEFAULT
MIME_TYPE VARCHAR2 IN DEFAULT
PRIORITY BINARY_INTEGER IN DEFAULT
ATTACHMENT VARCHAR2 IN
ATT_INLINE BOOLEAN IN DEFAULT
ATT_MIME_TYPE VARCHAR2 IN DEFAULT
ATT_FILENAME VARCHAR2 IN DEFAULT
REPLYTO VARCHAR2 IN DEFAULT
创建存放附件的目录:
create directory export as '/oracle/product/dump_dir';
grant read, write on directory export to public;
没有附件的邮件发送示例:
begin
utl_mail.send(sender => 'oracle@scmdbserver',
recipients => 'ypma@ique.com',
subject => 'oracle email test',
cc => 'gsun@ique.com, pzhang@ique.com',
message => 'sender ok?');
end;
/
带附件的邮件发送(基于文本的附件),如要要发送二进制附件,可以使用utl_mail.send_attach_raw过程:
DECLARE
fHandle utl_file.file_type;
vTextOut varchar2(32000);
text varchar2(32000);
BEGIN
fHandle := UTL_FILE.FOPEN('EXPORT', 'a.log', 'r');
IF UTL_FILE.IS_OPEN(fHandle) THEN
DBMS_OUTPUT.PUT_LINE('File read open');
ELSE
DBMS_OUTPUT.PUT_LINE('File read not open');
END IF;
LOOP
begin
UTL_FILE.GET_LINE(fHandle, vTextOut);
text := text||vTextOut;
EXCEPTION
WHEN NO_DATA_FOUND THEN EXIT;
end;
END LOOP;
UTL_FILE.FCLOSE(fHandle);
utl_mail.send_attach_varchar2(sender => 'oracle@scmdbserver',
recipients => 'ypma@ique.com',
subject => 'oracle email test',
cc => 'gsun@ique.com, pzhang@ique.com',
message => 'sender ok?',
attachment => text,
att_filename => 'a.log');
END;
/
oracle在send_attach_varchar2中附件内容用varchar2来存储,也就是说附件不能大于32k。send_attach_raw不能发送超过2000字节的附件。