在《使用包实现存储过程邮件发送》(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邮件包程序使用实践相关推荐

  1. oracle util_mail,ORACLE UTL_MAIL 发送Email 无附件 有附件

    [那些ORCALE DB可以做到的事] 如果你的DB是 ORACLE 10g 以上 那么就可以使用 package UTL_MAIL 提供的功能, 发邮件只需要一步就可以做到. 但是前期需要做一些DB ...

  2. oracle 依赖包自动安装包,ORACLE 安装提示缺少依赖包

    安装ORALCE 在做检验时提示缺少依赖包,其实是因为系统是64位系统而这些包都是32位的, This is a prerequisite condition to test whether the ...

  3. oracle读写文件--利用utl_file包对磁盘文件的读写操作

    oracle读写文件--利用utl_file包对磁盘文件的读写操作 摘要: 用户提出一个需求,即ORACLE中的一个表存储了照片信息,字段类型为BLOB,要求能导出成文件形式. 本想写个C#程序来做, ...

  4. 连接Oracle错误:800a0e7a未找到提供程序的解决

    一.现象: C#程序中需要以Provider=OraOLEDB.Oracle.1方式访问ORACLE数据库.但程序执行时报异常:未在本地计算机注册"OraOLEDB.Oracle.1&quo ...

  5. oracle中srv添加监听服务,Oracle 11g ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务...

    Oracle 11g ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务 解决过程: 1. 找到listener.ora监听文件,具体位置:D:\app\Administrator ...

  6. oracle存储过程导出查询结果,ORACLE如何实现函数、包、存储过程的导入和导出

    建 议可以用常规的检查,检查一下:数据字典信息/exp 导出结构检查 1.检查 SELECT * FROM ALL_SOURCE t WHERE T.OWNER = '要查询用户' AND t.TYP ...

  7. Oracle 命名服务和监听程序

    Oracle 命名服务和监听程序 这段时间在做命名服务和监听服务,做异构数据库迁移,从SQL server 2005中到Oracle 10gR2中.对命名服务和监听服务有了了解: 命名服务:conn ...

  8. 适配Oracle版本的ojbc驱动包版本,以及ojdbc驱动包的下载地址

    1.适配Oracle版本的ojbc驱动包版本 2. ojdbc驱动包的下载地址 ojdbc各个版本下载 3.将ojdbc放在一个c盘根目录下,然后以管理员身份打开cmd,执行下面命令:(做这一一步之前 ...

  9. 28 Oracle深度学习笔记——ORACLE自带DBMS函数包

    28.Oracle深度学习笔记--ORACLE自带DBMS函数包 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50830889 ...

最新文章

  1. 【Smart_Point】unique_ptr中独占指针使用MakeFrame
  2. 赠书 | 2021年中国数字政府发展指数排名出炉!你的家乡名列第几?
  3. MyBatis全局配置文件介绍
  4. Prefix HDU - 5790 字典树 + 主席树
  5. 权威预测:未来一年,企业云服务将会如何发展?
  6. 面试官:int和Integer有什么区别?为什么要有包装类?
  7. bool python 运算_python基础知识和pycharm安装
  8. stc89c52开发板遥控器解码 红外线发射 内置 eeprom 存储 串口显示编码
  9. 软件测试工程师-HTML
  10. 使用scrapy报错:attrs() got an unexpected keyword argument 'eq'解决办法
  11. iPhone XR降价匹敌iPhone11:64GB到手仅4199元
  12. C++ Semaphore信号量使用
  13. Spring Boot 部署与后台运行服务配置
  14. 没有找到MSVCP80D.dll,因此这个应用程序未能启动。重新安装应用程序...
  15. AlphaGo算法框架解读
  16. 《SEM长尾搜索营销策略解密》一一2.7 经济基础决定上层建筑,文化也是
  17. 这是互联网变得越来越敌对的7种方式
  18. centos7下载spark连接mysql数据库提取数据(pyspark,Scala,python独立执行)
  19. 影视金曲-爱你一生嫌未够_昆仑奴插曲》
  20. linux系统 ubuntu20.04 qq安装 闪退解决办法

热门文章

  1. MySQL 索引失效的 15 种场景!
  2. 面试突击 005 | Redis 是如何实现高可用的?它的实现方式有哪些?「视频版」
  3. web api添加拦截器
  4. golang 字符串操作实例
  5. www(apache)服务器的基本设置
  6. 2013-11-11 Oracle 课堂测试 练习题 例:BULK COLLECT及return table
  7. 《Introduction to Computing Systems: From bits and gates to C and beyond》
  8. C++函数的用法:erase函数
  9. c++opencv显示中文_OpenCV如何入门秘籍
  10. windows系统改装为linux系统_Linux怎么克隆系统?备份系统跟Windows系统有区别吗?...