由Oracle PL/SQL中寄信

我有時候會使用Oracle的PL/SQL來寫一些程序,可以提供給前端的程式來叫用,或者使用Oracle的排程器來叫用,就可以做到許多原本要用C#或PB等開發工具才能做到的事。PL/SQL可以提供很好的效能,配合SQL Developer工具就可以跨平台在Windows或Mac OSX,Linux等不同電腦上寫程式。
最近在寫一個定期檢查的功能,想要在程式檢查到某些特別狀況時,希望可以寄送信件通知。找了一些資料,先稍作整理:

1. PL/SQL寄email的方式由早期的UTL_TCP,UTL_SMTP,到10g之後主要是推UTL_MAIL, 但是UTL_MAIL預設沒有安裝,必須由DBA先行安裝並設定一個指定郵件主機的初始參數。
$cd $ORACLE_HOME/rdbms/admin
$sqlplus / as sysdba
> @ utlmail.sql
> @ prvtmail.plb
> grant execute on UTL_MAIL to public;
> alter system set smtp_out_server='xxx.xxx.xxx.xxx'
然後就可以很簡單的叫用一個程序來寄信了。
utl_mail.send(sender, recipients, cc, bcc, subject, message, mine_type);
我直接在SQL Developer裡測試正常,但是將此程式包在另一個程序裡叫用時,卻出現ORA-24247的錯誤。Google了一下找到這篇ORA-06502 ORA-24247 calling UTL_MAIL from Oracle 11gR2 說要再建立一個ACL,然後要利用此ACL指派權限可以存取該郵件主機。不過,我在建立ACL時,卻又出現另一個錯誤訊息:function-based index XDB.XDB$ACL_XIDX is disabled並告訴我可以重建或啟用該索引。我直接在SQL Developer中重建該索引,卻一直失敗。再去Google後找到另一篇Fine-grained access to network services,發現他也是同樣的情況,而且他說他重建索引後就可以了。我才想到自己雖然具有DBA的權限,但是可能權限還不夠大。所以切換到Terminal,以sysdba身份登入去執行重建索引的動作,就成功了。
$ sqlplus / as sysdba
> alter index xxx rebuild;

2.  UTL_MAIL雖然用起來簡單,但有幾個問題:
  A 只能夾一個附件
  B 附件只能小於32KB
  C 沒有驗證帳號密碼(SMTP AUTH)的功能

3. 找到兩篇談如何寄大於32K附件檔的文章
  How to Send Email Attachments with Oracle PL/SQL
  PLSQL Mail Solution


留言

這個網誌中的熱門文章

D-BUS學習筆記

Cisco Switch學習筆記: EtherChannel

Cisco Switch學習筆記: interface的封包錯誤統計