利用 UTL_SMTP、UTL_TCP、UTL_ENCODE、DBMS_LOB、UTL_FILE 等內建套件,在 PL/SQL 中實現功能完整的郵件發送存儲過程,支援純文字/HTML 內容、多附件 (Base64/7bit)、多收件人、SMTP AUTH 認證、動態建立/刪除 Directory 物件。
; 或 , 分隔,自動解析為清單逐一發送。7bit (文字) 與 Base64 (二進位) 兩種編碼,自動切分 MIME 邊界。P_NEED_SMTP=1 時啟用 AUTH LOGIN,Base64 編碼帳密。CREATE/DROP DIRECTORY 供 UTL_FILE/BFILENAME 讀取,用畢即刪,減少永久物件風險。multipart/mixed、Content-Disposition、Content-Transfer-Encoding 標頭。| 參數 | 說明 | 預設值 |
|---|---|---|
P_TXT | 郵件內容 | - |
P_SUB | 主旨 | - |
P_SENDOR | 寄件者 | - |
P_RECEIVER | 收件人 (多筆用 ; 或 , 分隔) | - |
P_SERVER | SMTP 主機 | - |
P_PORT | SMTP 埠號 | 25 |
P_NEED_SMTP | 是否需 AUTH LOGIN (1/0) | 0 |
P_USER / P_PASS | SMTP 帳號/密碼 | 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');
UTL_SMTP、UTL_ENCODE)。GRANT EXECUTE ON UTL_SMTP TO user;、GRANT CREATE ANY DIRECTORY, DROP ANY DIRECTORY TO user; (或由 DBA 代建永久 Directory)。DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE 開放 SMTP 主機/埠存取。DBMS_CRYPTO 加密儲存或外部金鑰管理。DBMS_SCHEDULER / AQ) 避免阻塞 Session。UTL_MAIL 簡化介面,但附件處理仍需 UTL_SMTP 底層控制。