程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 使用utl_smtp從Oracle中發送電子郵件

使用utl_smtp從Oracle中發送電子郵件

編輯:Oracle數據庫基礎

假如你目前運行的是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或段落標簽來改變信息主體的格式。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved