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 編資料