oracle util_mail,Oracle 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_mail、utl_tcp、utl_smtp和dbms_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(
3i_vc_subject in varchar2,
4i_vc_message in varchar2,
5o_vc_message out varchar2
6)
7is
8vc_subject varchar2(1000);
9begin
10vc_subject := 'Message From NBS System : '||i_vc_subject;
11
12utl_mail.send(sender => 'liuziyu@acca.com.cn',
13recipients => 'realkid4@126.com',
14subject => vc_subject,
15message => i_vc_message,mime_type => 'text/plain;charset=UTF-8');
16exception
17when others then
18o_vc_message := 'Errors in P_MAILUTIL_FOR_NBS_NC '||sqlcode||'-'|| sqlerrm;
19return;
20end 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,只具有connect和resource兩個基本權限。此外就是對p_mailutil_for_nbs_nc的調用權限。沒有utl_*包的權限,也沒有可以設置ACL訪問權限。
4、非sys用戶調用
下面實驗非sys用戶調用效果。
--切換用戶
SQL> conn test/test@ora11g;
Connected to Oracle Database11gEnterpriseEdition Release11.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)相關內容。
總結
以上是生活随笔為你收集整理的oracle util_mail,Oracle UTL_MAIL邮件包程序使用实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用并发工具类(线程池)
- 下一篇: AI 趋势