ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle UTL_MAIL邮件包程序使用实践

Oracle UTL_MAIL邮件包程序使用实践

原创 Linux操作系统 作者:realkid4 时间:2011-06-21 19:29:14 0 删除 编辑

 

在《使用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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    7677251