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邮件包程序使用实践相关推荐
- oracle util_mail,ORACLE UTL_MAIL 发送Email 无附件 有附件
[那些ORCALE DB可以做到的事] 如果你的DB是 ORACLE 10g 以上 那么就可以使用 package UTL_MAIL 提供的功能, 发邮件只需要一步就可以做到. 但是前期需要做一些DB ...
- oracle 依赖包自动安装包,ORACLE 安装提示缺少依赖包
安装ORALCE 在做检验时提示缺少依赖包,其实是因为系统是64位系统而这些包都是32位的, This is a prerequisite condition to test whether the ...
- oracle读写文件--利用utl_file包对磁盘文件的读写操作
oracle读写文件--利用utl_file包对磁盘文件的读写操作 摘要: 用户提出一个需求,即ORACLE中的一个表存储了照片信息,字段类型为BLOB,要求能导出成文件形式. 本想写个C#程序来做, ...
- 连接Oracle错误:800a0e7a未找到提供程序的解决
一.现象: C#程序中需要以Provider=OraOLEDB.Oracle.1方式访问ORACLE数据库.但程序执行时报异常:未在本地计算机注册"OraOLEDB.Oracle.1&quo ...
- oracle中srv添加监听服务,Oracle 11g ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务...
Oracle 11g ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务 解决过程: 1. 找到listener.ora监听文件,具体位置:D:\app\Administrator ...
- oracle存储过程导出查询结果,ORACLE如何实现函数、包、存储过程的导入和导出
建 议可以用常规的检查,检查一下:数据字典信息/exp 导出结构检查 1.检查 SELECT * FROM ALL_SOURCE t WHERE T.OWNER = '要查询用户' AND t.TYP ...
- Oracle 命名服务和监听程序
Oracle 命名服务和监听程序 这段时间在做命名服务和监听服务,做异构数据库迁移,从SQL server 2005中到Oracle 10gR2中.对命名服务和监听服务有了了解: 命名服务:conn ...
- 适配Oracle版本的ojbc驱动包版本,以及ojdbc驱动包的下载地址
1.适配Oracle版本的ojbc驱动包版本 2. ojdbc驱动包的下载地址 ojdbc各个版本下载 3.将ojdbc放在一个c盘根目录下,然后以管理员身份打开cmd,执行下面命令:(做这一一步之前 ...
- 28 Oracle深度学习笔记——ORACLE自带DBMS函数包
28.Oracle深度学习笔记--ORACLE自带DBMS函数包 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50830889 ...
最新文章
- 【Smart_Point】unique_ptr中独占指针使用MakeFrame
- 赠书 | 2021年中国数字政府发展指数排名出炉!你的家乡名列第几?
- MyBatis全局配置文件介绍
- Prefix HDU - 5790 字典树 + 主席树
- 权威预测:未来一年,企业云服务将会如何发展?
- 面试官:int和Integer有什么区别?为什么要有包装类?
- bool python 运算_python基础知识和pycharm安装
- stc89c52开发板遥控器解码 红外线发射 内置 eeprom 存储 串口显示编码
- 软件测试工程师-HTML
- 使用scrapy报错:attrs() got an unexpected keyword argument 'eq'解决办法
- iPhone XR降价匹敌iPhone11:64GB到手仅4199元
- C++ Semaphore信号量使用
- Spring Boot 部署与后台运行服务配置
- 没有找到MSVCP80D.dll,因此这个应用程序未能启动。重新安装应用程序...
- AlphaGo算法框架解读
- 《SEM长尾搜索营销策略解密》一一2.7 经济基础决定上层建筑,文化也是
- 这是互联网变得越来越敌对的7种方式
- centos7下载spark连接mysql数据库提取数据(pyspark,Scala,python独立执行)
- 影视金曲-爱你一生嫌未够_昆仑奴插曲》
- linux系统 ubuntu20.04 qq安装 闪退解决办法
热门文章
- MySQL 索引失效的 15 种场景!
- 面试突击 005 | Redis 是如何实现高可用的?它的实现方式有哪些?「视频版」
- web api添加拦截器
- golang 字符串操作实例
- www(apache)服务器的基本设置
- 2013-11-11 Oracle 课堂测试 练习题 例:BULK COLLECT及return table
- 《Introduction to Computing Systems: From bits and gates to C and beyond》
- C++函数的用法:erase函数
- c++opencv显示中文_OpenCV如何入门秘籍
- windows系统改装为linux系统_Linux怎么克隆系统?备份系统跟Windows系统有区别吗?...