SAK 図書館
Oracle PL/SQL 編8 - SMTP メール送信 utl_smtp、utl_raw.cast_to_raw
UTL_SMTP を使用すると、Oracle から SMTP メールが送信できる。
但し、UTL_ENCODE.BASE64_ENCODE で、BASE64 にエンコードなどしないと、
S-JIS のまま送信される。(Oracle8i - 8.1.6 以降)
■型
・open_connection が戻してくる SMTP コネクション型です。
smtp utl_smtp.connection;
・command 等が戻してくる SMTP サーバからの応答型です。
reply utl_smtp.reply;
|_ code(pls_integer) 応答コード 3 桁
text(varchar2) 応答メッセージ
replies utl_smtp.replies; -- reply の table 型
■open_connection
・SMTP 接続を確立します。
smtp := utl_smtp.open_connection(mlsvr, 25, timeout);
| | | |_ タイムアウト秒
| | | 省略値は NULL で無限
| | | (in pls_integer)
| | |_ SMTP ポート番号(通常 25)
| | 省略値は 25
| | (in pls_integer)
| |_ SMTP サーバ名、または、IP アドレス
| (in varchar2)
|_ 戻り値(connection)
■command
・SMTP コマンドを実行します。
ret := utl_smtp.command(smtp, cmd, arg);
| | | |_ SMTP コマンドパラメタ
| | | 省略値は NULL
| | | (in varchar2)
| | |_ SMTP コマンド
| | (in varchar2)
| |_ SMTP コネクション
| (in connection)
|_ 戻り値(reply)
■replies
・応答が複数になる SMTP コマンドを実行します。
ret := utl_smtp.replies(smtp, cmd, arg);
| | | |_ SMTP コマンドパラメタ
| | | 省略値は NULL
| | | (in varchar2)
| | |_ SMTP コマンド
| | (in varchar2)
| |_ SMTP コネクション
| (in connection)
|_ 戻り値(replies)
■helo
・SMTP 接続後の初期応答を行う。
utl_smtp.helo(smtp, domain);
| |_ 送信側ドメイン名
| (in varchar2)
|_ SMTP コネクション
(in connection)
■ehlo
・詳細な SMTP 接続後の初期応答を行う。
ret := utl_smtp.ehlo(smtp, domain);
| | |_ 送信側ドメイン名
| | (in varchar2)
| |_ SMTP コネクション
| (in connection)
|_ 戻り値(replies)
■mail
・発信元メールアドレスを設定します。
utl_smtp.mail(smtp, from);
| |_ 発信元メールアドレス
| (in varchar2)
|_ SMTP コネクション
(in connection)
■rcpt
・送信先メールアドレスを設定します。
utl_smtp.rcpt(smtp, to);
| |_ 送信先メールアドレス
| (in varchar2)
|_ SMTP コネクション
(in connection)
■data
・メール本文を設定します。
utl_smtp.data(smtp, body);
| |_ メール本文
| (in varchar2)
|_ SMTP コネクション
(in connection)
■open_data
・送信メールをオープンします。
utl_smtp.open_data(smtp);
|_ SMTP コネクション
(in connection)
■write_data
・メールヘッダ、本文を設定します。
utl_smtp.write_data(smtp, mail);
| |_ メールヘッダ、本文
| (in varchar2)
|_ SMTP コネクション
(in connection)
■write_raw_data
・メールヘッダ、本文を設定します。
utl_smtp.write_raw_data(smtp, mail);
| |_ メールヘッダ、本文
| (in raw)
|_ SMTP コネクション
(in connection)
■close_data
・送信メールを完結します。
utl_smtp.close_data(smtp);
|_ SMTP コネクション
(in connection)
■rset
・送信メールを破棄します。
utl_smtp.rset(smtp);
|_ SMTP コネクション
(in connection)
■vrfy
・メールアドレスの妥当性を確認します。
rcd := utl_smtp.vrfy(smtp, mladr);
| | |_ SMTP コネクション
| | (in varchar2)
| |_ SMTP コネクション
| (in connection)
|_ 戻り値(reply)
250、251 で始まるメッセージが返れば妥当
■noop
・メールサーバ応答を確認できます。
rcd := utl_smtp.noop(smtp);
| |_ SMTP コネクション
| (in connection)
|_ 戻り値(varchar2)
250 で始まるメッセージが返れば正常
■quit
・SMTP 接続を終了します。
utl_smtp.quit(smtp);
|_ SMTP コネクション
(in connection)
■SMTP メール送信 (エンコードなしパターン)
・utl_smtp.data での送信には日本語を含めることはできない。
日本語を使用すると送信時に「?」に置き換えて送信されます。
次項目の「BASE64 エンコードパターン」のように utl_smtp.open_data を
使用して BASE64 エンコードで送信すると良いです。
declare
mlsvr varchar2(40) := 'sak-design'; -- メールサーバ名、または、IP
mlfr varchar2(40) := 'sak@sak-design'; -- 発信元メールアドレス
mlto varchar2(40);
mlsub varchar2(80);
mlmsg varchar2(2000);
smtp utl_smtp.connection;
begin
-- メールデータセット
mlto := 'sak@sak-design'; -- 送信先メールアドレス
mlsub := 'title'; -- メールタイトル
mlmsg := 'mail body' || chr(13) || chr(10); -- メール本文
mlmsg := mlmsg || '0123456789' || chr(13) || chr(10);
mlmsg := mlmsg || 'abcdefg' || chr(13) || chr(10);
-- メール送信
smtp := utl_smtp.open_connection(mlsvr, 25);
utl_smtp.helo(smtp, mlsvr);
utl_smtp.mail(smtp, mlfr);
utl_smtp.rcpt(smtp, mlto);
utl_smtp.data(smtp,
'To:' || mlto || chr(13) || chr(10) ||
'From:' || mlfr || chr(13) || chr(10) ||
'Subject:' || mlsub || chr(13) || chr(10) ||
chr(13) || chr(10) || mlmsg
);
utl_smtp.quit(smtp);
end;
/
■受信実メール内容 (エンコードなしパターン)
Received: from sak-design by sak-design (PMS 3.0.9.16) id 2CE3132BF1FF; Wed, 03 Jul 2002 02:25:22 +0900 (JST)
To:sak@sak-design
From:sak@sak-design
Subject:title
Message-Id: <200207021725.2CE3132BF1FF@sak-design>
Date: Wed, 03 Jul 2002 02:25:22 +0900 (JST)
X-UIDL: 2ce3132b94597d010244790a7a180937
mail body
0123456789
abcdefg
.
■SMTP メール送信 (BASE64 エンコードパターン Oracle9i 以降)
・環境によっては、以下の 'charset="iso-2022-jp"' の部分を
'charset: iso-2022-jp' としないと本文に文字化けが発生するようです。
うちの環境では、どちらを指定しても文字化けしませんでした。
declare
mlsvr varchar2(40) := 'sak-design'; -- メールサーバ名、または、IP
mlfr varchar2(40) := 'sak@sak-design'; -- 発信元メールアドレス
mlto varchar2(40);
mlsub varchar2(80);
mlmsg varchar2(2000);
smtp utl_smtp.connection;
begin
-- メールデータセット
mlto := 'sak@sak-design'; -- 送信先メールアドレス
mlsub := 'タイトル'; -- メールタイトル
mlmsg := 'メール本文' || chr(13) || chr(10); -- メール本文
mlmsg := mlmsg || 'あいうえお' || chr(13) || chr(10);
mlmsg := mlmsg || 'abcdefg' || chr(13) || chr(10);
-- メール送信
smtp := utl_smtp.open_connection(mlsvr, 25);
utl_smtp.helo(smtp, mlsvr);
utl_smtp.mail(smtp, mlfr);
utl_smtp.rcpt(smtp, mlto);
utl_smtp.open_data(smtp);
utl_smtp.write_data(smtp, 'To:' || mlto || chr(13) || chr(10));
utl_smtp.write_data(smtp, 'From:' || mlfr || 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(mlsub)
));
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(mlmsg)
));
utl_smtp.close_data(smtp);
utl_smtp.quit(smtp);
end;
/
■受信実メール内容 (BASE64 エンコードパターン Oracle9i 以降)
Received: from sak-design by sak-design (PMS 3.0.9.16) id 2CE3145969E0; Wed, 03 Jul 2002 02:34:50 +0900 (JST)
To:sak@sak-design
From:sak@sak-design
Subject:=?iso-2022-jp?B?g16DQ4Nng4s=?=
MIME-Version: 1.0
Content-Type: text/plain;
charset="iso-2022-jp"
Content-Transfer-Encoding: base64
Message-Id: <200207021734.2CE3145969E0@sak-design>
Date: Wed, 03 Jul 2002 02:34:50 +0900 (JST)
X-UIDL: 2ce31459db72559cd248a0111e84685a
g4GBW4OLlnuVtg0KgqCCooKkgqaCqA0KYWJjZGVmZw0K
.
■E-mail エンコード
・一般的なメールエンコードは、Subject が BASE64、本文が JIS になって
いるように思う。
Outlook Express では、エンコードなしの S-JIS のままでも
Subject、本文が BASE64 でも問題なく読める。
インターネットへ送信するメールは、少なくとも BASE64 のエンコードは
した方が安全だろう。
・メールヘッダのBASE64 Subject 形式は、次のとおりである。
=?コード形式?タイプ?タイトル?=
| | || || |_ ?= 終了コード
| | || ||_ エンコードタイトル文字列
| | || |_ ? 区切りコード
| | ||_ BASE64 は「B」
| | |_ ? 区切りコード
| |_ BASE64 は「iso-2022-jp」
|_ =? 開始コード
・メール本文のBASE64 エンコード指定は、次のとおりである。
MIME-Version: 1.0
Content-Type: text/plain;
charset="iso-2022-jp"
Content-Transfer-Encoding: base64
■例外
INVALID_OPERATION 操作無効
TRANSIENT_ERROR SMTP 応答エラー(応答コード 400 番台)
PERMANENT_ERROR SMTP 応答エラー(応答コード 500 番台)
■Oracle PL/SQL 編資料
■SQL 基礎実地編資料
■SQL 基礎編資料
■SQL チューニング編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■MySQL 編資料