假如你目前運行的是Oracleg或更高的版本那麼你現在就可以用新的utl_mail工具包從你的PL/SQL應用程序來發送電子郵件了(注釋如果你的應用程序使構建在Oracle i的基礎之上前提是運行維護在Oracle g或以上版本那麼你也可以通過舊的utl_smtp工具包來發送電子郵件)
utl_smtp代碼的一個優點就是可以在Oracle g上正常運行所以我們不需要用utl_mail來替代utl_smtp工具包雖然utl_mail完全替代utl_smtp的一天勿庸置疑會降臨不過現在utl_smtp還能夠滿足我們的需求
首先確認utl_smtp工具包已經安裝在你的系統裡(當然是在SYS架構裡)如果你還沒有安裝這個工具包可以在你的ORACLE_HOME\RDBMS\admin文件夾中找到utlsmtpsql腳本你還需要utl_tcp包同樣的如果你發現utl_tcp包還沒有加載也可以從跟utlsmtpsql腳本相同的路徑找到utltcpsql腳本最後你還需要知道你的企業SMTP服務器的URL(注意下面的例子不適用於對SMTP進行了安全設置的服務器如Gmail)
程序包說明語句
以下是引用片段
create or replace PACKAGE sendmail IS
procedure send (p_sender varchar
p_recipient varchar
p_subject varchar
p_body varchar default null);
end sendmail;
仔細觀察以上語句的主體和下面的程序包你可能會發現send的公共模式(public method)依賴於被稱為common的私有模式(private method)這樣以後我們可以對這個程序包進行擴展並為大家展示怎樣發送二進制大對象(blob)附件例如如果你生成了一份PDF文檔並把它保存在你的數據庫裡你可以會想要把它作為電子郵件的附件發送出去 common模式就是用來完成這個任務的將要用到的代碼來自於基本send模式和send_blob模式
以下就是程序包的主體
以下是引用片段
create or replace PACKAGE BODY sendmail IS
procedure common (p_sender varchar
p_recipient varchar
p_subject varchar
c out nnection) is
v_recipient varchar();
begin
make connection to smtp
c := utl_smtpopen_connection();
identify the domain of the sender
utl_smtphelo(c );
start a mail specify the sender
utl_smtpmail(c p_sender);
identify recipient
utl_smtprcpt(c v_recipient);
start the mail body
utl_smtpopen_data(c);
utl_smtpwrite_data(c From: || p_sender || utl_tcpcrlf);
utl_smtpwrite_data(c To: || p_recipient || utl_tcpcrlf);
utl_smtpwrite_data(c Subject: || p_subject || utl_tcpcrlf);
exception
when utl_smtptransient_error or utl_smtppermanent_error then
utl_smtpquit(c);
raise;
when others then
raise;
end common;
procedure send (p_sender varchar
p_recipient varchar
p_subject varchar
p_body varchar default null) is
c nnection;
begin
common(p_sender p_recipient p_subject c);
utl_smtpwrite_data(c ContentType: text/html || utl_tcpcrlf);
utl_smtpwrite_data(c utl_tcpcrlf || p_body);
utl_smtpclose_data(c);
utl_smtpquit(c);
exception
when utl_smtptransient_error or utl_smtppermanent_error then
utl_smtpquit(c);
raise;
when others then
raise;
end send;
end sendmail;
上面的這個程序裡有些地方是需要用具體的信息來替代的第一個是提供SMTP服務器的地方需要添加你自己要添加的任何企業STMP服務器
——make connection to smtp
c = utl_smtpopen_connection()
其次是需要驗證域的地方需要用你的確切域名來替代
——identify the domain of the sender
utl_smtphelo(c )
以上就是獲取基本的電子郵件功能所需要的所有程序你可以通過以下的語句來調用此程序
下面是引用的實例片段
begin
sendmailsend (
r
Subject: Hello
How about your trip?);
end;
你可以發現上面在郵件的主體部分(body)的字符串嵌入了超文本編輯模式效果(字體為粗體)這是因為前面在send模式下將內容類型設置為text/html
utl_smtpwrite_data(c ContentType text/html || utl_tcpcrlf)
注意請不要把chr()作為換行符嵌入到帶格式的電子郵件中發送出去因為HTML模式會把它忽略掉你可以使用break或段落標簽來改變信息主體的格式
From:http://tw.wingwit.com/Article/program/Oracle/201311/18283.html