假如你目前運行的是Oracle10g或更高的版本,那麼你現在就可以用新的utl_mail工具包從你的PL/SQL應用程序來發送電子郵件了。(注釋:如果你的應用程序使構建在Oracle 8i的基礎之上,前提是運行維護在Oracle 10g或以上版本,那麼你也可以通過舊的utl_smtp工具包來發送電子郵件。)
utl_smtp代碼的一個優點就是可以在Oracle 10g上正常運行,所以我們不需要用utl_mail來替代utl_smtp工具包。雖然utl_mail完全替代utl_smtp的一天勿庸置疑會降臨,不過現在utl_smtp還能夠滿足我們的需求。
首先,確認utl_smtp工具包已經安裝在你的系統裡(當然是在SYS架構裡)。如果你還沒有安裝這個工具包,可以在你的Oracle_HOME\RDBMS\admin文件夾中找到utlsmtp.sql腳本。你還需要utl_tcp包;同樣的,如果你發現utl_tcp包還沒有加載,也可以從跟utlsmtp.sql腳本相同的路徑找到utltcp.sql腳本。最後,你還需要知道你的企業SMTP服務器的URL。(注意,下面的例子不適用於對SMTP進行了安全設置的服務器,如Gmail)
程序包說明語句:
以下是引用片段:
create or replace PACKAGE sendmail IS
procedure send (p_sender varchar2,
p_recipIEnt varchar2,
p_subject varchar2,
p_body varchar2 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 varchar2,
p_recipIEnt varchar2,
p_subject varchar2,
c out utl_smtp.connection) is
v_recipIEnt varchar2(1000);
begin
--make connection to smtp
c := utl_smtp.open_connection('smtp.example.com');
--identify the domain of the sender
utl_smtp.helo(c, 'example.com');
--start a mail, specify the sender
utl_smtp.mail(c, p_sender);
--identify recipIEnt
utl_smtp.rcpt(c, v_recipIEnt);
--start the mail body
utl_smtp.open_data(c);
utl_smtp.write_data(c, 'From: ' || p_sender || utl_tcp.crlf);
utl_smtp.write_data(c, 'To: ' || p_recipIEnt || utl_tcp.crlf);
utl_smtp.write_data(c, 'Subject: ' || p_subject || utl_tcp.crlf);
exception
when utl_smtp.transIEnt_error or utl_smtp.permanent_error then
utl_smtp.quit(c);
raise;
when others then
raise;
end common;
procedure send (p_sender varchar2,
p_recipIEnt varchar2,
p_subject varchar2,
p_body varchar2 default null) is
c utl_smtp.connection;
begin
common(p_sender, p_recipIEnt, p_subject, c);
utl_smtp.write_data(c, 'Content-Type: text/Html' || utl_tcp.crlf);
utl_smtp.write_data(c, utl_tcp.crlf || p_body);
utl_smtp.close_data(c);
utl_smtp.quit(c);
exception
when utl_smtp.transIEnt_error or utl_smtp.permanent_error then
utl_smtp.quit(c);
raise;
when others then
raise;
end send;
end sendmail;
上面的這個程序裡有些地方是需要用具體的信息來替代的。第一個是提供SMTP服務器的地方,需要添加你自己要添加的任何企業STMP服務器:
--make connection to smtp
c := utl_smtp.open_connection('smtp.example.com');
其次是需要驗證域的地方,需要用你的確切域名來替代:
--identify the domain of the sender
utl_smtp.helo(c, 'example.com');
以上就是獲取基本的電子郵件功能所需要的所有程序,你可以通過以下的語句來調用此程序:
下面是引用的實例片段:
begin
sendmail.send ('[email protected]',
'[email protected]',
'Subject: Hello',
'How about your trip?');
end;
你可以發現上面在郵件的主體部分(body)的字符串嵌入了超文本編輯模式效果(字體為粗體)。這是因為前面在send模式下將內容類型設置為text/Html:
utl_smtp.write_data(c, 'Content-Type: text/Html' || utl_tcp.crlf);
注意:請不要把chr(10)作為換行符嵌入到帶格式的電子郵件中發送出去,因為Html模式會把它忽略掉。你可以使用break或段落標簽來改變信息主體的格式。