oracle存储过程借助utl,使用UTL_MAIL包实现存储过程邮件发送
郵件通知預(yù)警和提示在當(dāng)前系統(tǒng)中已經(jīng)是一個(gè)比較常見的功能。各類型語(yǔ)言分別針對(duì)郵件提供了功能包和API接口方法,本篇介紹如何在PL/SQL代碼中使用UTL_MAIL工具包發(fā)送郵件,同時(shí)還介紹配置中注意的細(xì)節(jié)要點(diǎn)。
1、安裝UTL_MAIL包
UTL_MAIL是在Oracle 10g推出的新郵件發(fā)送開發(fā)包。之前Oracle 8i開始,支持使用utl_smtp包進(jìn)行RFC所定義的簡(jiǎn)單郵件傳輸協(xié)議(SMTP)。使用UTL_MAIL要簡(jiǎn)單與傳統(tǒng)方式,免除很多額外工作。
默認(rèn)情況下,UTL_MAIL工具包是沒(méi)有安裝到Oracle程序包中的,如果需要使用需要額外進(jìn)行安裝。安裝的方法是在sys用戶下,調(diào)用$ORACLE_HOME/rdbms/admin目錄下的兩個(gè)腳本文件。
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.
兩個(gè)腳本的作用就是建立utl_mail工具包。之后要進(jìn)行一些參數(shù)配置,其中最重要的是smtp_out_server參數(shù)。該參數(shù)指定的是連接郵件服務(wù)器的名稱(或者ip地址)。默認(rèn)情況下,該字符串類型參數(shù)的取值為空。
SQL> show parameter smtp
NAMETYPEVALUE
------------------------------------ ----------- ------------------------------
smtp_out_serverstring
設(shè)置上指定的郵件服務(wù)器。
--需要設(shè)置該參數(shù)
SQL> alter system set smtp_out_server='10.1.2.55'scope=both;
System altered.
//動(dòng)態(tài)修改后立刻生效
SQL> show parameter smtp
NAMETYPEVALUE
------------------------------------ ----------- ------------------------------
smtp_out_serverstring10.1.2.55
注意:在一些Oracle早期版本中,該參數(shù)smtp_out_server是不支持動(dòng)態(tài)修改(scope=memory)的。所以只能使用靜態(tài)修改(scope=spfile),之后重啟動(dòng)數(shù)據(jù)庫(kù)服務(wù)器。筆者實(shí)驗(yàn)的環(huán)境是oracle 11g R2,是支持動(dòng)態(tài)修改的。
2、在SYS上直接使用utl_mail包
首先實(shí)驗(yàn)下在sys下使用utl_mail包,發(fā)送郵件的方法是utl_mail.send方法。下面是方法簽名。
Send方法參數(shù)很多,大部分都有使用默認(rèn)值的機(jī)會(huì)。下面分別介紹一下各個(gè)參數(shù)。
üSender:發(fā)送者,為必填參數(shù)。填寫郵件發(fā)送者郵箱地址;
üRecipients:接收者郵箱列表,如果是多個(gè)使用逗號(hào)進(jìn)行分割;
üCc:郵件抄送列表;
üBcc:郵件密文抄送列表;
üSubject:郵件主題;
üMessage:郵件信息內(nèi)容;
üMine_type:編碼格式;
üPriority:消息的優(yōu)先級(jí);
下面在sys下使用utl_mail.send方法發(fā)送郵件。
--直接使用在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
到接受郵箱中,果然看到了發(fā)送郵件。SYS下使用成功。
3、非SYS用戶使用郵箱配置
如果是在非SYS用戶下直接使用utl_mail包,需要進(jìn)行何種配置呢?首先是進(jìn)行包執(zhí)行權(quán)限配置。需要將utl_tcp、utl_mail、utl_smtp和dbms_network_acl_admin四個(gè)包的執(zhí)行權(quán)限賦給該用戶。
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
之后,實(shí)驗(yàn)使用。
//在scott用戶下調(diào)用
SQL>
begin
utl_mail.send(sender => 'liuziyu@acca.com.cn',
recipients => 'realkid4@126.com',
message => 'sdlfsdfsdfsdfseew**師地方是',
subject => ' SCCS航空');
end;
ORA-24247:網(wǎng)絡(luò)訪問(wèn)被訪問(wèn)控制列表(ACL)拒絕
ORA-06512:在"SYS.UTL_MAIL", line 654
ORA-06512:在"SYS.UTL_MAIL", line 671
ORA-06512:在line 2
相同的執(zhí)行語(yǔ)句,并且已經(jīng)進(jìn)行賦予執(zhí)行權(quán)限,為什么報(bào)錯(cuò)24247呢?使用utl_mail要求系統(tǒng)對(duì)調(diào)用用戶開啟ACL(Access Control List)訪問(wèn)控制列表權(quán)限,允許用戶具有連接connect到網(wǎng)絡(luò)郵件服務(wù)器的權(quán)限。可以使用如下方法進(jìn)行賦予權(quán)限操作。
Begin
//設(shè)置權(quán)限項(xiàng)目
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
//指定訪問(wèn)主機(jī)和相應(yīng)端口;
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (acl => 'email_server_permissions.xml',
host => '10.1.2.55',
lower_port => 25);
END;
/
之后再使用發(fā)送郵件方法:
SQL> begin
2utl_mail.send(sender => 'liuziyu@acca.com.cn',
3recipients => 'realkid4@126.com',
4message => 'sdlfsdf電風(fēng)扇f(wàn)sdfseew**師地方是',
5subject => '中國(guó)中心');
6
7end;
8/
PL/SQL procedure successfully completed
發(fā)送成功,也在接受郵箱上發(fā)現(xiàn)郵件。
4、亂碼問(wèn)題解決
我們上面郵件打開之后,發(fā)現(xiàn)郵件subject顯示正常中文,而message內(nèi)容顯示出亂碼。為如下:
sdlfsdf???fsdfseew??????
看來(lái)是中文引起的編碼問(wèn)題。可以通過(guò)調(diào)用中改寫mine_type參數(shù)的方法來(lái)解決。默認(rèn)情況下,郵件字符集是us-ascii方式的。支持中文可以使用UTF-8。
SQL> begin
2utl_mail.send(sender => 'liuziyu@acca.com.cn',
3recipients => 'realkid4@126.com',
4message => 'sdlfsdf電風(fēng)扇f(wàn)sdfseew**師地方是',
5subject => '中國(guó)中心',
6mime_type => 'text/plain;charset=UTF-8');
7
8end;
9/
PL/SQL procedure successfully completed
接受到的郵件內(nèi)容為:
sdlfsdf電風(fēng)扇f(wàn)sdfseew**師地方是
顯示正常。
5、Utl_mail使用實(shí)踐和結(jié)論
系統(tǒng)功能中,郵件是一個(gè)比較特殊的功能。其中發(fā)送者郵箱、郵件服務(wù)器位置等內(nèi)容常常是統(tǒng)一,而且不對(duì)一般模塊可配置的。所以,筆者建議如下使用UTL_MAIL包方法。
ü使用包封裝方法,將UTL_MAIL方法不直接暴露給系統(tǒng)用戶,而是在SYS下建立一個(gè)自定義郵件發(fā)送方法,預(yù)設(shè)值好發(fā)送者郵箱等內(nèi)容。主題和信息都已參數(shù)的形式傳入;
ü借用所有者權(quán)限機(jī)制,將執(zhí)行自定義方法的執(zhí)行權(quán)限賦給系統(tǒng)用戶schema。這樣可以控制用戶的權(quán)限不會(huì)濫用,也便于管理;
UTL_MAIL較傳統(tǒng)的簡(jiǎn)單郵件傳輸方法,調(diào)用方式簡(jiǎn)化了很多,易用性增強(qiáng)。除了本次介紹的send方法,還可以實(shí)現(xiàn)附件內(nèi)容的發(fā)送。這些復(fù)雜功能就留待日后繼續(xù)研究。
總結(jié)
以上是生活随笔為你收集整理的oracle存储过程借助utl,使用UTL_MAIL包实现存储过程邮件发送的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: snkrs抽签协议获取
- 下一篇: 华为AppGallery常用跳转与链接详