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