Send Mail on Oracle PL/SQL - 第 3 期 (顯示中文字)

第二期寫到如何用 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 最終版 : 點選此處.
Related Posts Plugin for WordPress, Blogger...