欢迎光临
我们一直在努力

Oracle邮件发送

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来实现。

 

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字节的附件。

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。