SAK 図書館

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

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 編資料
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索



Copyright (C) 1999-2017 Y.SAK