首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle UTL_SMTP 發送郵件完整實作:附件、多收件人、SMTP 認證、MIME 編碼與目錄動態建立

     編輯:Oracle 資料庫基礎

利用 UTL_SMTP、UTL_TCP、UTL_ENCODE、DBMS_LOB、UTL_FILE 等內建套件,在 PL/SQL 中實現功能完整的郵件發送存儲過程,支援純文字/HTML 內容、多附件 (Base64/7bit)、多收件人、SMTP AUTH 認證、動態建立/刪除 Directory 物件。

核心功能特色

  • 多收件人: 以 ; 或 , 分隔,自動解析為清單逐一發送。
  • 附件支援: 7bit (文字) 與 Base64 (二進位) 兩種編碼,自動切分 MIME 邊界。
  • SMTP 認證: P_NEED_SMTP=1 時啟用 AUTH LOGIN,Base64 編碼帳密。
  • 動態 Directory: 附件路徑解析目錄與檔名,臨時 CREATE/DROP DIRECTORY 供 UTL_FILE/BFILENAME 讀取,用畢即刪,減少永久物件風險。
  • MIME 多部件結構: 正確組裝 multipart/mixed、Content-Disposition、Content-Transfer-Encoding 標頭。

主要參數說明

參數說明預設值
P_TXT郵件內容-
P_SUB主旨-
P_SENDOR寄件者-
P_RECEIVER收件人 (多筆用 ; 或 , 分隔)-
P_SERVERSMTP 主機-
P_PORTSMTP 埠號25
P_NEED_SMTP是否需 AUTH LOGIN (1/0)0
P_USER / P_PASSSMTP 帳號/密碼NULL
P_FILENAME附件完整路徑 (多筆分隔)NULL
P_ENCODE附件編碼: 'bit 7' 或 'base64''bit 7'

關鍵程式碼結構節錄

CREATE OR REPLACE PROCEDURE PROCSENDEMAIL(...) AUTHID CURRENT_USER IS
  -- 常數: MIME 邊界、CRLF、最大行寬
  BOUNDARY CONSTANT VARCHAR2(256) := '-----BYSUK';
  FIRST_BOUNDARY CONSTANT VARCHAR2(256) := '--' || BOUNDARY || UTL_TCP.CRLF;
  LAST_BOUNDARY  CONSTANT VARCHAR2(256) := '--' || BOUNDARY || '--' || UTL_TCP.CRLF;
  MULTIPART_MIME_TYPE CONSTANT VARCHAR2(256) := 'multipart/mixed; boundary="' || BOUNDARY || '"';

  -- 內部函數: 解析路徑、動態建立/刪除 DIRECTORY、分割字串清單
  -- 內部程序: 寫入 SMTP 標頭/內容、處理 MIME 邊界、附件讀取與 Base64 分塊編碼
  -- 主流程: OPEN_CONNECTION → HELO → AUTH → MAIL FROM → RCPT TO → DATA → 組裝 MIME → QUIT
BEGIN
  -- 解析收件人清單
  -- 逐一發送 (支援多附件)
END;

呼叫範例

EXEC PROCSENDEMAIL(
  'Hello content', 'Test Subject',
  'sender@domain.com', 'rcpt1@domain.com;rcpt2@domain.com',
  'mail.domain.com', 25, 1,
  'smtp_user', 'smtp_pass',
  'F:\attach\doc.pdf;F:\attach\img.jpg',
  'base64');

部署前置作業

  1. 資料庫版本 9i+ (需 UTL_SMTP、UTL_ENCODE)。
  2. 授權:GRANT EXECUTE ON UTL_SMTP TO user;、GRANT CREATE ANY DIRECTORY, DROP ANY DIRECTORY TO user; (或由 DBA 代建永久 Directory)。
  3. 網路 ACL (11g+):DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE 開放 SMTP 主機/埠存取。
  4. OS 防火牆/SELinux 需允許資料庫主機出站 SMTP 埠。

安全與維運建議

  • 避免在程式碼寫死密碼,建議用 DBMS_CRYPTO 加密儲存或外部金鑰管理。
  • 大量發送時考慮非同步佇列 (DBMS_SCHEDULER / AQ) 避免阻塞 Session。
  • 記錄發送日誌 (成功/失敗/錯誤碼) 供稽核追蹤。
  • 12c+ 可改用 UTL_MAIL 簡化介面,但附件處理仍需 UTL_SMTP 底層控制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved