大家好,我是只談技術(shù)不剪發(fā)的 Tony 老師。
我們?cè)陂_發(fā) Oracle 數(shù)據(jù)庫(kù)程序時(shí),如果想要通過(guò) PL/SQL 存儲(chǔ)過(guò)程實(shí)現(xiàn)發(fā)送郵件的功能,大概可以使用以下三種方法:
今天我們要介紹的是第 3 種方法,也就是通過(guò) UTL_MAIL 程序包在 PL/SQL 程序中實(shí)現(xiàn)發(fā)送郵件的功能。Oracle 10g 開始提供 UTL_MAIL 程序包。
默認(rèn)情況下,系統(tǒng)沒(méi)有安裝 UTL_MAIL 程序包。因?yàn)樗枰O(shè)置 SMTP_OUT_SERVER 配置參數(shù),同時(shí)還會(huì)涉及到一些安全問(wèn)題。
首先,執(zhí)行以下語(yǔ)句安裝 UTL_MAIL 程序包:
sqlplus sys/pwd> SQL> @$ORACLE_HOME/rdbms/admin/utlmail.sql SQL> @$ORACLE_HOME/rdbms/admin/prvtmail.plb
然后設(shè)置 SMTP_OUT_SERVER 參數(shù):
sqlplus sys/pwd> SQL> ALTER SYSTEM SET smtp_out_server='smtp.domain.com' SCOPE=SPFILE;
如果使用 Oracle 10g R1,需要重啟服務(wù),更高版本不需要。
建議在數(shù)據(jù)庫(kù)服務(wù)器上設(shè)置一個(gè)郵件轉(zhuǎn)發(fā),而不是直接連接到外部的郵件服務(wù)器。郵件轉(zhuǎn)發(fā)配置非常簡(jiǎn)單,設(shè)置一個(gè)引用 SMTP_OUT_SERVER 參數(shù)的 localhost 的配置。任何連接外部郵件服務(wù)器的復(fù)雜配置都隱藏在郵件轉(zhuǎn)發(fā)配置中。
完成安裝和配置之后,我們可以使用存儲(chǔ)過(guò)程 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ù)的作用如下:
以下是一個(gè)發(fā)送郵件的簡(jiǎn)單示例:
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 測(cè)試', message => '郵件正文', mime_type => 'text/plain; charset=UTF-8'); -- 支持中文 END; /
除了發(fā)送文本郵件之外,UTL_MAIL 程序包還提供了兩個(gè)支持附件的存儲(chǔ)過(guò)程: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);
這兩個(gè)存儲(chǔ)過(guò)程比 UTL_MAIL.SEND 支持以下額外的參數(shù):
以下是一個(gè)發(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 測(cè)試', message => '郵件正文', mime_type => 'text/plain; charset=UTF-8', -- 支持中文 attachment => '附件內(nèi)容', att_mime_type => 'text/plain; charset=UTF-8', -- 支持中文 att_filename => '附件.txt'); END; /
UTL_MAIL 程序包使用調(diào)用者權(quán)限,也就是說(shuō)使用該程序的用戶需要擁有訪問(wèn)外部郵件服務(wù)器的權(quán)限。
如果遇到以下錯(cuò)誤,表示缺少相應(yīng)的權(quán)限。
ORA-24247: network access denied by access control list (ACL)
此時(shí)我們可以通過(guò)以下語(yǔ)句授予指定用戶(例如 scott)訪問(wèn)外部服務(wù)器上的 SMPT 服務(wù)權(quán)限:
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; /
詳細(xì)內(nèi)容可以參考官方文檔。
到此這篇關(guān)于如何使用Oracle PL/SQL 實(shí)現(xiàn)發(fā)送電子郵件功能(UTL_MAIL)的文章就介紹到這了,更多相關(guān)Oracle PL/SQL 發(fā)送電子郵件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:酒泉 張掖 衡水 AXB 阜陽(yáng) 雞西 貴港 萍鄉(xiāng)
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《如何使用Oracle PL/SQL 實(shí)現(xiàn)發(fā)送電子郵件功能(UTL_MAIL)》,本文關(guān)鍵詞 如何,使用,Oracle,SQL,實(shí)現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。