Utl_mail程序包

使用UTL_MAIL包实现存储过程邮件发送

邮件通知预警和提示在当前系统中已经是一个比较常见的功能。各类型语言分别针对邮件提供了功能包和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方法。下面是方法签名。

 

复制代码
 UTL_MAIL.SEND(SENDER  IN  VARCHAR2  CHARACTER  SET ANY_CS,
               RECIPIENTS  IN  VARCHAR2  CHARACTER  SET ANY_CS,
               CC  IN  VARCHAR2  CHARACTER  SET ANY_CS  DEFAULT  NULL,
               BCC  IN  VARCHAR2  CHARACTER  SET ANY_CS  DEFAULT  NULL,
               SUBJECT  IN  VARCHAR2  CHARACTER  SET ANY_CS  DEFAULT  NULL,
               MESSAGE  IN  VARCHAR2  CHARACTER  SET ANY_CS,
               MIME_TYPE  IN  VARCHAR2  DEFAULT  ' text/plain; charset=us-ascii ',
               PRIORITY  IN PLS_INTEGER  DEFAULT  NULL);
复制代码

 

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_tcputl_mailutl_smtpdbms_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要求系统对调用用户开启ACLAccess 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,不知何故,我用UTF-8输出中文还是乱码,后来使用'text/plain;charset=ZHS16GBK' OK.

 

 

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**师地方是

 

 

显示正常。

 

 

5Utl_mail使用实践和结论

 

系统功能中,邮件是一个比较特殊的功能。其中发送者邮箱、邮件服务器位置等内容常常是统一,而且不对一般模块可配置的。所以,笔者建议如下使用UTL_MAIL包方法。

 

ü       使用包封装方法,将UTL_MAIL方法不直接暴露给系统用户,而是在SYS下建立一个自定义邮件发送方法,预设值好发送者邮箱等内容。主题和信息都已参数的形式传入;

ü       借用所有者权限机制,将执行自定义方法的执行权限赋给系统用户schema。这样可以控制用户的权限不会滥用,也便于管理

 

 

UTL_MAIL较传统的简单邮件传输方法,调用方式简化了很多,易用性增强。除了本次介绍的send方法,还可以实现附件内容的发送。这些复杂功能就留待日后继续研究。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于Oracle存储过程发送邮件的问题。使用UTL_MAIL包可以实现存储过程的邮件发送。具体步骤如下: 1. 首先需要确认数据库中是否已经安装UTL_MAIL包。可以通过以下命令进行检查: ``` SELECT COUNT(*) FROM dba_objects WHERE object_type = 'PACKAGE' AND object_name = 'UTL_MAIL'; ``` 如果返回结果为1,则说明已经安装UTL_MAIL包。 2. 在存储过程中调用UTL_MAIL包中的PROCEDURE来发送邮件。以下为一个发送邮件的示例: ``` CREATE OR REPLACE PROCEDURE send_email (p_to IN VARCHAR2, p_subject IN VARCHAR2, p_message IN VARCHAR2) IS BEGIN UTL_MAIL.send(sender => 'sender_email_address', recipients => p_to, subject => p_subject, message => p_message); END; ``` 在此示例中,send_email存储过程接受三个参数:p_to,p_subject和p_message。其中,p_to为收件人的电子邮件地址,p_subject为邮件主题,p_message为邮件内容。在UTL_MAIL.send过程中,需要指定发件人的电子邮件地址。 注意:在使用UTL_MAIL包发送邮件之前,需要先配置SMTP服务器信息。可以使用以下命令进行配置: ``` EXECUTE UTL_MAIL.SET_SMTP_HOST('smtp_server_address'); EXECUTE UTL_MAIL.SET_SMTP_PORT(smtp_server_port); EXECUTE UTL_MAIL.SET_REPLY_TO('reply_to_email_address'); ``` 在此命令中,需要将smtp_server_address替换为SMTP服务器的地址,将smtp_server_port替换为SMTP服务器的端口号,将reply_to_email_address替换为回复邮件的电子邮件地址。 3. 调用send_email存储过程来发送邮件。以下为一个发送邮件的示例: ``` BEGIN send_email(p_to => 'recipient_email_address', p_subject => 'Test Email', p_message => 'This is a test email.'); END; ``` 在此示例中,调用send_email存储过程来发送邮件。将recipient_email_address替换为收件人的电子邮件地址,将'Test Email'替换为邮件主题,将'This is a test email.'替换为邮件内容。 希望这个回答能够帮助到你。如果还有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值