
大家好,我是只談技術不剪發(fā)的 Tony 老師。
我們在開發(fā) Oracle 數(shù)據(jù)庫程序時,如果想要通過 PL/SQL 存儲過程實現(xiàn)發(fā)送郵件的功能,大概可以使用以下三種方法:
- 利用 UTL_TCP 程序包基于 TCP 協(xié)議發(fā)送郵件。這種方法比較原始,需要用戶編寫基礎交換代碼。
- 利用 UTL_SMTP 程序包基于 SMTP 協(xié)議發(fā)送郵件。這種方法比編碼 TCP 操作簡單很多,支持發(fā)送電子郵件的各種操作,因此使用非常廣泛。
- 利用 UTL_MAIL 程序包發(fā)送郵件。這種方法最簡單,支持常用的郵件功能,不需要了解 SMTP 協(xié)議。
今天我們要介紹的是第 3 種方法,也就是通過 UTL_MAIL 程序包在 PL/SQL 程序中實現(xiàn)發(fā)送郵件的功能。Oracle 10g 開始提供 UTL_MAIL 程序包。
安裝 UTL_MAIL
默認情況下,系統(tǒng)沒有安裝 UTL_MAIL 程序包。因為它需要設置 SMTP_OUT_SERVER 配置參數(shù),同時還會涉及到一些安全問題。
首先,執(zhí)行以下語句安裝 UTL_MAIL 程序包:
sqlplus sys/pwd>
SQL> @$ORACLE_HOME/rdbms/admin/utlmail.sql
SQL> @$ORACLE_HOME/rdbms/admin/prvtmail.plb
然后設置 SMTP_OUT_SERVER 參數(shù):
sqlplus sys/pwd>
SQL> ALTER SYSTEM SET smtp_out_server='smtp.domain.com' SCOPE=SPFILE;
如果使用 Oracle 10g R1,需要重啟服務,更高版本不需要。
建議在數(shù)據(jù)庫服務器上設置一個郵件轉發(fā),而不是直接連接到外部的郵件服務器。郵件轉發(fā)配置非常簡單,設置一個引用 SMTP_OUT_SERVER 參數(shù)的 localhost 的配置。任何連接外部郵件服務器的復雜配置都隱藏在郵件轉發(fā)配置中。
發(fā)送郵件
完成安裝和配置之后,我們可以使用存儲過程 UTL_MAIL.SEND 發(fā)送郵件:
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 3,
replyto IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);
這些參數(shù)的作用如下:
- SENDER:發(fā)送者的郵件地址
- RECIPIENTS:接收者的郵件地址,多個地址使用逗號分隔
- CC:抄送者的郵件地址,多個地址使用逗號分隔,默認為 NULL
- BCC:密送者的郵件地址,多個地址使用逗號分隔,默認為 NULL
- SUBJECT:郵件主題,默認為 NULL
- MESSAGE:郵件正文
- MIME_TYPE:郵件的 MIME 類型,默認為 text/plain; charset=us-ascii
- PRIORITY:郵件優(yōu)先級,1 級最高,5 級最低,默認為 3
- REPLYTO:回復郵件發(fā)送的目標地址,Oracle 11g R2 開始支持該參數(shù)
以下是一個發(fā)送郵件的簡單示例:
BEGIN
UTL_MAIL.send(sender => 'myname@domain.com',
recipients => 'zhangsan@domain.com,lisi@domain.com',
cc => 'wangwu@domain.com',
bcc => 'myboss@domain.com',
subject => 'UTL_MAIL 測試',
message => '郵件正文',
mime_type => 'text/plain; charset=UTF-8'); -- 支持中文
END;
/
發(fā)送附件
除了發(fā)送文本郵件之外,UTL_MAIL 程序包還提供了兩個支持附件的存儲過程:SEND_ATTACH_RAW 以及 SEND_ATTACH_VARCHAR2 。它們分別可以用于發(fā)送 RAW 以及 VARCHAR2 格式的附件。
UTL_MAIL.SEND_ATTACH_RAW (
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 DEFAULT NULL,
mime_type IN VARCHAR2 DEFAULT CHARACTER SET ANY_CS
DEFAULT 'text/plain; charset=us-ascii',
priority IN PLS_INTEGER DEFAULT 3,
attachment IN RAW,
att_inline IN BOOLEAN DEFAULT TRUE,
att_mime_type IN VARCHAR2 CHARACTER SET ANY_CS
DEFAULT 'text/plain; charset=us-ascii',
att_filename IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,
replyto IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);
UTL_MAIL.SEND_ATTACH_VARCHAR2 (
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 DEFAULT NULL,
mime_type IN VARCHAR2 CHARACTER SET ANY_CS
DEFAULT 'text/plain; charset=us-ascii',
priority IN PLS_INTEGER DEFAULT 3,
attachment IN VARCHAR2 CHARACTER SET ANY_CS, ,
att_inline IN BOOLEAN DEFAULT TRUE,
att_mime_type IN VARCHAR2 CHARACTER SET ANY_CS
DEFAULT 'text/plain; charset=us-ascii',
att_filename IN VARCHAR2CHARACTER SET ANY_CS DEFAULT NULL,
replyto IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);
這兩個存儲過程比 UTL_MAIL.SEND 支持以下額外的參數(shù):
- ATTACHMENT:附件內容,數(shù)據(jù)類型為 RAW 或者 VARCHAR2
- ATT_INLINE:指定附件是否在郵件正文中顯式,默認為 TRUE
- ATT_MIME_TYPE:附件的 MIME 類型,默認為 ‘a(chǎn)pplication/octet' 或者 ‘text/plain; charset=us-ascii'
- ATT_FILENAME:附件的文件名,默認為 NULL
以下是一個發(fā)送文本附件的示例:
BEGIN
UTL_MAIL.send(sender => 'myname@domain.com',
recipients => 'zhangsan@domain.com,lisi@domain.com',
cc => 'wangwu@domain.com',
bcc => 'myboss@domain.com',
subject => 'UTL_MAIL 測試',
message => '郵件正文',
mime_type => 'text/plain; charset=UTF-8', -- 支持中文
attachment => '附件內容',
att_mime_type => 'text/plain; charset=UTF-8', -- 支持中文
att_filename => '附件.txt');
END;
/
注意事項
UTL_MAIL 程序包使用調用者權限,也就是說使用該程序的用戶需要擁有訪問外部郵件服務器的權限。
如果遇到以下錯誤,表示缺少相應的權限。
ORA-24247: network access denied by access control list (ACL)
此時我們可以通過以下語句授予指定用戶(例如 scott)訪問外部服務器上的 SMPT 服務權限:
BEGIN;
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'www.domain.comm',
ace => xs$ace_type(privilege_list => xs$name_list('smtp'),
principal_name => 'scott',
principal_type => xs_acl.ptype_db));
END;
/
詳細內容可以參考官方文檔。
到此這篇關于如何使用Oracle PL/SQL 實現(xiàn)發(fā)送電子郵件功能(UTL_MAIL)的文章就介紹到這了,更多相關Oracle PL/SQL 發(fā)送電子郵件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Oracle區(qū)別ADG與DG案例詳解
- oracle創(chuàng)建用戶過程詳解
- Oracle rac案例講解
- Oracle存儲過程案例詳解
- Oracle之TO_DATE用法詳解
- springboot+mybatis-plus+oracle實現(xiàn)邏輯刪除
- oracle+mybatis-plus+springboot實現(xiàn)分頁查詢的實例
- Oracle中NEXTVAL案例詳解