PL/SQL UTL_SMTP使用時の日本語文字化け対策を教えて下さい。
845598Mar 8 2011 — edited Mar 10 2011こんにちは。
今更とおもわれるでしょうが、UTL_SMTPを使ったメール発信の結果、
日本語の文字化けが発生しました。
対応策をご存知の方、教えてくださいませ。
同じプログラムを使用して、環境により文字化けが発生します。
状況は下記の通りです。
64BIT環境は32BIT環境とは対応方法が異なるのでしょうか?
1.文字化けする場合
環境
OS:Windows(R) Server 2003 R2 Enterprise x64 Edition
DB:Oracle 10G Release 10.2.0.4.0 - 64bit Production
受信結果(メーラ:Outlook)
タイトル部 → 繧ソ繧、繝医Ν
本文 → 繝。繝シ繝ォ譛ャ譁・
縺ゅ>縺・∴縺・
・ア・イ・ウ・エ・オ・ア
ABCDEFG
2.文字化けしない場合
環境
OS:Windows Server 2003 Standard Edition(32bit)
DB:Oracle 10G Enterprise Edition Release 10.2.0.1.0 - Prod
受信結果(メーラ:Outlook)
タイトル部 → タイトル
本文 → メール本文
あいうえお
アイウエオア
ABCDEFG
使用したプログラムは下記のサンプルプログラムです。
/*--メール送信プロシージャー*/
CREATE OR REPLACE PROCEDURE SEND_MAIL IS
VC_SVR VARCHAR2(40) := 'smtp.fal.com'; --メールサーバ名,IP
VC_FROM VARCHAR2(40) := 'fal@net.com'; --発信元
VC_TO VARCHAR2(40);
VC_SUB VARCHAR2(80);
VC_MSG VARCHAR2(2000);
SMTP UTL_SMTP.CONNECTION;
BEGIN
/*データセット*/
VC_TO := 'fal@net.com'; --送信先メールアドレス
VC_SUB := 'タイトル'; --メールタイトル
VC_MSG := 'メール本文' || CHR(13) || CHR(10); --メール本文
VC_MSG := VC_MSG || 'あいうえお' || CHR(13) || CHR(10);
VC_MSG := VC_MSG || 'アイウエオア' || CHR(13) || CHR(10);
VC_MSG := VC_MSG || 'ABCDEFG' || CHR(13) || CHR(10);
/*メール送信*/
SMTP := UTL_SMTP.OPEN_CONNECTION(VC_SVR, 25);
UTL_SMTP.HELO(SMTP, VC_SVR);
UTL_SMTP.MAIL(SMTP, VC_FROM);
UTL_SMTP.RCPT(SMTP, VC_TO);
UTL_SMTP.OPEN_DATA(SMTP);
UTL_SMTP.WRITE_DATA(SMTP, 'TO:' || VC_TO || CHR(13) || CHR(10));
UTL_SMTP.WRITE_DATA(SMTP, 'FROM:' || VC_FROM || CHR(13) || CHR(10));
UTL_SMTP.WRITE_DATA(SMTP, 'SUBJECT:=?ISO-2022-JP?B?');
UTL_SMTP.WRITE_RAW_DATA(SMTP,
UTL_ENCODE.BASE64_ENCODE
(
UTL_RAW.CAST_TO_RAW(VC_SUB)
)
);
UTL_SMTP.WRITE_DATA(SMTP, '?=' || CHR(13) || CHR(10));
UTL_SMTP.WRITE_DATA(SMTP, 'MIME-VERSION: 1.0' || CHR(13) || CHR(10));
UTL_SMTP.WRITE_DATA(SMTP, 'CONTENT-TYPE: TEXT/PLAIN;' || CHR(13) || CHR(10));
UTL_SMTP.WRITE_DATA(SMTP, CHR(9) || 'CHARSET="ISO-2022-JP"' || CHR(13) || CHR(10));
UTL_SMTP.WRITE_DATA(SMTP, 'CONTENT-TRANSFER-ENCODING: BASE64' || CHR(13) || CHR(10));
UTL_SMTP.WRITE_DATA(SMTP, CHR(13) || CHR(10));
UTL_SMTP.WRITE_RAW_DATA(SMTP,
UTL_ENCODE.BASE64_ENCODE
(
UTL_RAW.CAST_TO_RAW(VC_MSG)
)
);
UTL_SMTP.CLOSE_DATA(SMTP);
UTL_SMTP.QUIT(SMTP);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/