oracle 加密包显示不全_使用UTL_MAIL包实现存储过程邮件发送

1aa10112d8eeb03b1af554c8f62aa5ef.png

邮件通知预警和提示在当前系统中已经是一个比较常见的功能。各类型语言分别针对邮件提供了功能包和API接口方法,本篇介绍如何在PL/SQL代码中使用UTL_MAIL工具包发送邮件,同时还介绍配置中注意的细节要点。

1、安装UTL_MAIL包

UTL_MAIL是在Oracle10g推出的新邮件发送开发包。之前Oracle 8i开始,支持使用utl_smtp包进行RFC所定义的简单邮件传输协议(SMTP)。使用UTL_MAIL要简单与传统方式,免除很多额外工作。

默认情况下,UTL_MAIL工具包是没有安装到Oracle程序包中的,如果需要使用需要额外进行安装。安装的方法是在sys用户下,调用$ORACLE_HOME/rdbms/admin目录下的两个脚本文件。

SQL> conn / as sysdba;

Connected.

SQL> @$ORACLE_HOME/rdbms/admin/utlmail.sql

Package created.

Synonym created.

SQL> @$ORACLE_HOME/rdbms/admin/prvtmail.plb

Package created.

Package body created.

Grant succeeded.

Package body created.

No errors.

两个脚本的作用就是建立utl_mail工具包。之后要进行一些参数配置,其中最重要的是smtp_out_server参数。该参数指定的是连接邮件服务器的名称(或者ip地址)。默认情况下,该字符串类型参数的取值为空。

SQL> show parameter smtp

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

smtp_out_server string

设置上指定的邮件服务器。

--需要设置该参数

SQL> alter system set smtp_out_server='10.1.2.55'scope=both;

System altered.

//动态修改后立刻生效

SQL> show parameter smtp

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

smtp_out_server string 10.1.2.55

注意:在一些Oracle早期版本中,该参数smtp_out_server是不支持动态修改(scope=memory)的。所以只能使用静态修改(scope=spfile),之后重启动数据库服务器。笔者实验的环境是oracle11gR2,是支持动态修改的。

2、在SYS上直接使用utl_mail包

首先实验下在sys下使用utl_mail包,发送邮件的方法是utl_mail.send方法。下面是方法签名。

Send方法参数很多,大部分都有使用默认值的机会。下面分别介绍一下各个参数。

ü Sender:发送者,为必填参数。填写邮件发送者邮箱地址;

ü Recipients:接收者邮箱列表,如果是多个使用逗号进行分割;

ü Cc:邮件抄送列表;

ü Bcc:邮件密文抄送列表;

ü Subject:邮件主题;

ü Message:邮件信息内容;

ü Mine_type:编码格式;

ü Priority:消息的优先级;

下面在sys下使用utl_mail.send方法发送邮件。

--直接使用在sys上

begin

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

recipients => 'realkid4@126.com',

message => 'sdlfsdfsdfsdfseew**师地方是',

subject => 'SCCS航空');

end;

/

SQL>

PL/SQL procedure successfully completed

到接受邮箱中,果然看到了发送邮件。SYS下使用成功。

3、非SYS用户使用邮箱配置

如果是在非SYS用户下直接使用utl_mail包,需要进行何种配置呢?首先是进行包执行权限配置。需要将utl_tcp、utl_mail、utl_smtp和dbms_network_acl_admin四个包的执行权限赋给该用户。

SQL> grant execute on utl_tcp to scott;

Grant succeeded

SQL> grant execute on utl_smtp to scott;

Grant succeeded

SQL> grant execute on utl_mail to scott;

Grant succeeded

SQL> grant execute on dbms_network_acl_admin to scott;

Grant succeeded

之后,实验使用。

//在scott用户下调用

SQL>

begin

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

recipients => 'realkid4@126.com',

message => 'sdlfsdfsdfsdfseew**师地方是',

subject => ' SCCS航空');

end;

ORA-24247:网络访问被访问控制列表(ACL)拒绝

ORA-06512:在"SYS.UTL_MAIL", line 654

ORA-06512:在"SYS.UTL_MAIL", line 671

ORA-06512:在line 2

相同的执行语句,并且已经进行赋予执行权限,为什么报错24247呢?使用utl_mail要求系统对调用用户开启ACL(Access Control List)访问控制列表权限,允许用户具有连接connect到网络邮件服务器的权限。可以使用如下方法进行赋予权限操作。

Begin

//设置权限项目

DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (acl => 'email_server_permissions.xml',

description => 'Enables network permissions for the e-mail server',

principal => 'SCOTT',

is_grant => TRUE,

privilege => 'connect');

end;

/

BEGIN

//指定访问主机和相应端口;

DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (acl => 'email_server_permissions.xml',

host => '10.1.2.55',

lower_port => 25);

END;

/

之后再使用发送邮件方法:

SQL> begin

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

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

4 message => 'sdlfsdf电风扇fsdfseew**师地方是',

5 subject => '中国中心');

6

7 end;

8 /

PL/SQL procedure successfully completed

发送成功,也在接受邮箱上发现邮件。

4、乱码问题解决

我们上面邮件打开之后,发现邮件subject显示正常中文,而message内容显示出乱码。为如下:

sdlfsdf???fsdfseew??????

看来是中文引起的编码问题。可以通过调用中改写mine_type参数的方法来解决。默认情况下,邮件字符集是us-ascii方式的。支持中文可以使用UTF-8。

SQL> begin

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

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

4 message => 'sdlfsdf电风扇fsdfseew**师地方是',

5 subject => '中国中心',

6 mime_type => 'text/plain;charset=UTF-8');

7

8 end;

9 /

PL/SQL procedure successfully completed

接受到的邮件内容为:

sdlfsdf电风扇fsdfseew**师地方是

显示正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值