在 Oracle 10g 及以上版本中,開發人員可以使用較新的 UTL_MAIL 套件簡化郵件發送流程。然而,若系統仍運行於 Oracle 8i 資料庫,但實際維護環境已升級至 10g 或更高版本,仍可沿用經典的 UTL_SMTP 套件完成郵件發送,雖然程式碼較為繁瑣,但相容性極佳,無須強制遷移至 UTL_MAIL。
DBA_OBJECTS 確認 UTL_SMTP 與 UTL_TCP 狀態為 VALID。若未安裝,請至 $ORACLE_HOME/rdbms/admin 執行 utlsmtp.sql 與 utltcp.sql。DECLARE
l_mail_conn UTL_SMTP.CONNECTION;
l_smtp_host VARCHAR2(100) := 'smtp.example.com';
l_smtp_port NUMBER := 25;
BEGIN
-- 開啟連線
l_mail_conn := UTL_SMTP.OPEN_CONNECTION(l_smtp_host, l_smtp_port);
-- HELO/EHLO
UTL_SMTP.HELO(l_mail_conn, l_smtp_host);
-- 寄件者
UTL_SMTP.MAIL(l_mail_conn, 'sender@example.com');
-- 收件者
UTL_SMTP.RCPT(l_mail_conn, 'recipient@example.com');
-- 資料段
UTL_SMTP.OPEN_DATA(l_mail_conn);
UTL_SMTP.WRITE_DATA(l_mail_conn, 'Subject: 測試郵件' || UTL_TCP.CRLF);
UTL_SMTP.WRITE_DATA(l_mail_conn, 'From: sender@example.com' || UTL_TCP.CRLF);
UTL_SMTP.WRITE_DATA(l_mail_conn, 'To: recipient@example.com' || UTL_TCP.CRLF);
UTL_SMTP.WRITE_DATA(l_mail_conn, UTL_TCP.CRLF || '這是一封來自 Oracle 的測試郵件。' || UTL_TCP.CRLF);
UTL_SMTP.CLOSE_DATA(l_mail_conn);
-- 關閉連線
UTL_SMTP.QUIT(l_mail_conn);
EXCEPTION
WHEN OTHERS THEN
UTL_SMTP.QUIT(l_mail_conn);
RAISE;
END;
UTL_SMTP,若現有系統穩定運作,無須急於改寫。UTL_MAIL 搭配 Oracle Wallet,或透過外部 Java Stored Procedure 呼叫 JavaMail API。UTL_SMTP 雖屬舊世代 API,但因其輕量、相容性高,至今仍是舊版資料庫或簡單郵件需求的首選。掌握其基本操作流程,有助於在受限環境下快速實現資料庫郵件通知功能。