第二期寫到如何用 Oracle 的 utl_smtp 發送 HTML Mail :
第二期本期來說明, 如何讓
utl_smtp 發送中文 Mail.
但在這時候,
已不能用 utl_smtp.data 來放置資料, 而是改用 utl_smtp.write_data 與 utl_smtp.write_raw_data
utl_smtp.write_data 用來放置一般資訊
utl_smtp.write_raw_data 用來放置 16 進位資訊, 也是中文字必須轉換成 16 進位才可正常顯示
且使用這兩個函數, 必須先執行
utl_smtp.open_data而顯示中文的關鍵, 在於 Mail Header 要加上
Content-Type: text/html; charset=utf-8/big5, 如
big5 or
utf-8與
Content-Transfer-Encoding: 8bit這兩行
而如何得知資料庫語系, 請見我的另一篇文章 :
點選此處下面這是尚未修正前, 無法正常顯示中文的情形 :

Send Mail 中文字範例, 如下 : (注意紅色字體)
declare
mail_conn utl_smtp.connection; --宣告 Mail Object
CRLF varchar2(2) := CHR( 13 ) || CHR( 10 );
v_message varchar2(255);
begin
-- 開啟 Mail Connection 物件
mail_conn := utl_smtp.open_connection('172.16.xxx.xxx');
-- 建立連線
utl_smtp.ehlo(mail_conn, '172.16.xxx.xxx');
-- 設定 寄件者
utl_smtp.mail(mail_conn, 'tomkuo139@yahoo.com.tw');
-- 設定 收件者
utl_smtp.rcpt(mail_conn, 'aaa@xxx.yyy.zzz');
utl_smtp.rcpt(mail_conn, 'bbb@xxx.yyy.zzz');
-- 設定 發信內容
utl_smtp.open_data(mail_conn);
v_message := 'HTML 語法';
-- 寫入 Mail Header
utl_smtp.write_raw_data( mail_conn, utl_raw.cast_to_raw('Subject:Oracle 發送 Mail 測試' || CRLF) );
utl_smtp.write_data( mail_conn, 'MIME-Version: 1.0' || CRLF );
utl_smtp.write_data( mail_conn, 'Content-Type: text/html; charset=utf-8/big5' || CRLF );
utl_smtp.write_data( mail_conn, 'Content-Transfer-Encoding: 8bit' || CRLF );
-- 寫入 Mail Body
utl_smtp.write_raw_data( mail_conn, utl_raw.cast_to_raw(v_message) );
-- 結束連線
utl_smtp.close_data(mail_conn);
utl_smtp.quit(mail_conn);
end;
執行結果 :

這段程式在 Outlook Express 顯示中文是正常的.
但在 Notes 中顯示仍為亂碼, 必須做一些修正, 範例:
主旨程式碼修正前: utl_raw.cast_to_raw('Subject...')
主旨程式碼修正後: utl_raw.cast_to_raw(
convert('Subject...', '
UTF8/ZHT16MSWIN950'))
為了顯示中文字, 就辛苦點吧.
Send Mail 第一期 :
點選此處.
Send Mail 第二期 :
點選此處.
Send Mail 最終版 :
點選此處.