Oracle郵件傳送

llnnmc發表於2017-12-10

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位元組的附件。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28974745/viewspace-2148502/,如需轉載,請註明出處,否則將追究法律責任。

相關文章