在資料庫層面直接發送郵件,可用於系統通知、報表分發、異常告警等場景。本文提供一個功能完整的 BSD_SENDEMAIL 預存程序,支援多收件人(以逗號分隔)、HTML 郵件內容、SMTP 認證、Base64 編碼主旨(解決中文亂碼)等企業級需求。
程序包含四大核心子程序:
P_SPLITE_STR:解析收件人字串,自動處理分號/逗號、去空格、加上 <> 格式WRITE_DATA:寫入郵件標頭與內容,使用 UTL_RAW.CAST_TO_RAW 配合 CONVERT 處理中文編碼(ZHS16CGB231280)END_BOUNDARY:處理 MIME 多部分郵件邊界結尾P_EMAIL:真正的 SMTP 連線、認證、發送流程p_user varchar2(30) := ''; -- SMTP 帳號
p_pass varchar2(30) := ''; -- SMTP 密碼
p_sendor varchar2(20) := 'GnIE'; -- 寄件人顯示名稱
p_server varchar2(20) := 'Mail_Server_IP'; -- SMTP 伺服器 IP
p_port number := 25; -- 連接埠
p_need_smtp number := 0; -- 是否需認證 (1=是)
程式採用 multipart/mixed 格式,支援 HTML 內容:
boundary constant varchar2(256) := '-----BYSUK';
first_boundary constant varchar2(256) := '--' || boundary || l_crlf;
last_boundary constant varchar2(256) := '--' || boundary || '--' || l_crlf;
multipart_mime_type constant varchar2(256) := 'multipart/mixed;boundary="' || boundary || '"';
在 PL/SQL 執行測試,發送耗時極短;Outlook 端即時收到 HTML 格式郵件,中文主旨與內容均正常顯示。

UTL_MAIL 或 UTL_SMTP 更高階封裝application/octet-stream 部分ACL(11g+ 網絡存取控制)設定,避免 ORA-24247 錯誤