Oracle UTL_MAIL郵件包程式使用實踐

realkid4發表於2011-06-21

 

在《使用UTL_MAIL包實現儲存過程郵件傳送》(http://space.itpub.net/17203031/viewspace-700327)中,筆者已經初步介紹了使用UTL_MAIL包實現系統郵件傳送功能。UTL_MAIL包較傳統的PL/SQL郵件傳送已經有很大改進和簡化。

 

但是對於一般系統而言,郵件功能設定(如傳送、接受郵箱設定、郵件伺服器)都是統一進行配置管理的,要有嚴格的控制。例如:一些敏感資訊就可能會透過有意的郵件呼叫加以洩露。本篇中,筆者介紹一種封裝utl_mail包的方法,進一步簡化郵件功能。

 

 

1、  相關配置專案

 

首先回顧一下使用Utl_mail包,並且進行郵件傳送需要進行的配置。

 

ü        sys使用者schema下,手動安裝utl_mail程式包;

ü        smtp_out_server引數進行配置,設定為郵件伺服器名稱或者IP地址;

ü        呼叫使用者必須對utl_mailutl_tcputl_smtpdbms_network_acl_admin包程式的execute許可權;

ü        將呼叫使用者加入到ACL訪問控制列表中,使其擁有connect許可權;

ü        如果進行中文message傳送,還要進行mime_type引數的設定。指定適合的編碼方式;

 

這些許可權設定賦予給系統使用者,潛在一些被濫用的可能。所以,我們可以藉助儲存過程的定義者許可權definer機制,對utl_mail包進行封裝。

 

 

2、  儲存過程定義

 

sys schema下定義儲存過程p_mailutil_for_nbs_nc

 

 

SQL> create or replace procedure P_MAILUTIL_FOR_NBS_NC

  2  (

  3       i_vc_subject in varchar2,

  4       i_vc_message in varchar2,

  5       o_vc_message out varchar2

  6  )

  7  is

  8  vc_subject varchar2(1000);

  9  begin

 10    vc_subject := 'Message From NBS System : '||i_vc_subject;

 11 

 12    utl_mail.send(sender => 'liuziyu@acca.com.cn',

 13                  recipients => 'realkid4@126.com',

 14                  subject => vc_subject,

 15                  message => i_vc_message,mime_type => 'text/plain;charset=UTF-8');

 16  exception

 17    when others then

 18       o_vc_message := 'Errors in P_MAILUTIL_FOR_NBS_NC '||sqlcode||'-'|| sqlerrm;

 19       return;

 20  end P_MAILUTIL_FOR_NBS_NC;

 21  /

 

Procedure created

 

 

sys使用者下實驗執行。

 

 

SQL> var vc_message varchar2(1000);

SQL> exec p_mailutil_for_nbs_nc(i_vc_subject => '勞動法',i_vc_message => 'sldf燒錄機',o_vc_message => :vc_message);

 

PL/SQL procedure successfully completed

vc_message

---------

 

郵件收到

 

 

sys使用者下,儲存過程p_mailutil_for_nbs_nc方法執行成功。

 

 

3、設定實驗使用者和許可權

 

sys下,我們新建立一個使用者,設定基本許可權。

 

 

SQL> create public synonym p_mailutil_for_nbs_nc for p_mailutil_for_nbs_nc;

Synonym created

 

SQL> create user test identified by test;

User created

 

SQL> grant connect to test;

Grant succeeded

 

SQL> grant resource to test;

Grant succeeded

 

SQL> grant execute on p_mailutil_for_nbs_nc to test;

Grant succeeded

 

 

新建立使用者test,只具有connectresource兩個基本許可權。此外就是對p_mailutil_for_nbs_nc的呼叫許可權。沒有utl_*包的許可權,也沒有可以設定ACL訪問許可權。

 

4、非sys使用者呼叫

 

下面實驗非sys使用者呼叫效果。

 

 

--切換使用者

SQL> conn test/test@ora11g;

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

Connected as test

 

SQL> var vc_message varchar2(1000);

SQL> exec p_mailutil_for_nbs_nc(i_vc_subject => 'TSET勞動法',i_vc_message => 'User TesT:sldf燒錄機',o_vc_message => :vc_message);

 

PL/SQL procedure successfully completed

vc_message

---------

 

 

郵件傳送成功。

 

5、結論

 

上述實驗,實現了對應用使用者最小範圍的許可權設定,實現統一的郵件傳送規範。注意,此處我們借用了儲存過程的定義者許可權機制。在預設情況下,呼叫一個儲存過程中,使用的物件和系統許可權是這個儲存過程定義者擁有的許可權。Sys使用者擁有對utl_*包和ACL訪問許可權,所以呼叫者只需要擁有儲存過程的執行許可權就可以了。這樣的配置也可以防止系統介面被濫用。

 

在進一步考慮,如果需要對p_mailutil_for_nbs_nc原始碼進行遮蔽,可以考慮使用wrap功能加以實現,可以參見筆者《使用Wrap加密,保護Oracle程式原始碼》(http://space.itpub.net/17203031/viewspace-695700)相關內容。

 

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

相關文章