本期來說明, 如何讓 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 最終版 : 點選此處.