UTL_SMTP モジュール

UTL_SMTP モジュールは、SMTP (Simple Mail Transfer Protocol) を介して E メールを送信する機能を提供します。

UTL_SMTP モジュールは、以下のルーチンで構成されます。

表 1. UTL_SMTP モジュールで使用可能な組み込みルーチン
ルーチン名 説明
CLOSE_DATA プロシージャー E メール・メッセージを終了します。
COMMAND プロシージャー SMTP コマンドを実行します。
COMMAND_REPLIES プロシージャー SMTP コマンドを実行します。複数の応答行が予想される場合はこちらを使用します。
DATA プロシージャー E メール・メッセージの本文を指定します。
EHLO プロシージャー SMTP サーバーとの初期ハンドシェークを実行し、拡張情報を返します。
HELO プロシージャー SMTP サーバーとの初期ハンドシェークを実行します。
HELP プロシージャー HELP コマンドを送信します。
MAIL プロシージャー メール・トランザクションを開始します。
NOOP プロシージャー NULL コマンドを送信します。
OPEN_CONNECTION 関数 接続を開きます。
OPEN_CONNECTION プロシージャー 接続を開きます。
OPEN_DATA プロシージャー DATA コマンドを送信します。
QUIT プロシージャー SMTP セッションを終了し、切断します。
RCPT プロシージャー E メール・メッセージの受信者を指定します。
RSET プロシージャー 現在のメール・トランザクションを終了します。
VRFY プロシージャー E メール・アドレスの妥当性を検査します。
WRITE_DATA プロシージャー E メール・メッセージの一部分を書き込みます。
WRITE_RAW_DATA プロシージャー RAW データで構成される E メール・メッセージの一部分を書き込みます。
次の表は、モジュールで使用可能なパブリック変数をリストしています。
表 2. UTL_SMTP モジュールで使用可能な組み込みタイプ
パブリック変数 データ・タイプ 説明
connection RECORD SMTP 接続の説明。
reply RECORD SMTP 応答行。
CONNECTION レコード・タイプは、SMTP 接続の説明を記述します。
ALTER MODULE SYSIBMADM.UTL_SMTP PUBLISH TYPE connection AS ROW
(
  /* name or IP address of the remote host running SMTP server */
    host VARCHAR(255),
  /* SMTP server port number */
    port INTEGER,
  /* transfer timeout in seconds */
    tx_timeout INTEGER,
);
REPLY レコード・タイプは、SMTP 応答行の説明を記述します。 REPLIES は、SMTP 応答行の配列です。
ALTER MODULE SYSIBMADM.UTL_SMTP PUBLISH TYPE reply AS ROW
(
  /* 3 digit reply code received from the SMTP server */
    code INTEGER,
  /* the text of the message received from the SMTP server */
    text VARCHAR(508)
);

例 1: 以下のプロシージャーは、UTL_SMTP モジュールを使用してテキスト E メール・メッセージを構成し、送信します。
CREATE OR REPLACE PROCEDURE send_mail(
IN p_sender VARCHAR(4096),
IN p_recipient VARCHAR(4096),
IN p_subj VARCHAR(4096),
IN p_msg VARCHAR(4096),
IN p_mailhost VARCHAR(4096))
SPECIFIC send_mail
LANGUAGE SQL
BEGIN
  DECLARE v_conn UTL_SMTP.CONNECTION;
  DECLARE v_crlf VARCHAR(2);
  DECLARE v_port INTEGER CONSTANT 25;

  SET v_crlf = CHR(13) || CHR(10);
  SET v_conn = UTL_SMTP.OPEN_CONNECTION(p_mailhost, v_port, 10);
  CALL UTL_SMTP.HELO(v_conn, p_mailhost);
  CALL UTL_SMTP.MAIL(v_conn, p_sender);
  CALL UTL_SMTP.RCPT(v_conn, p_recipient);
  CALL UTL_SMTP.DATA(
    v_conn,
    'Date: ' || TO_CHAR(SYSDATE, 'Dy, DD Mon YYYY HH24:MI:SS') || v_crlf ||
    'From: ' || p_sender || v_crlf ||
    'To: ' || p_recipient || v_crlf ||
    'Subject: ' || p_subj || v_crlf ||
    p_msg);
  CALL UTL_SMTP.QUIT(v_conn);
END@

CALL send_mail('bwayne@mycorp.com','pparker@mycorp.com','Holiday Party',
'Are you planning to attend?','smtp.mycorp.com')@
例 2: 以下の例では、DATA プロシージャーではなく、OPEN_DATA、WRITE_DATA、および CLOSE_DATA プロシージャーを使用します。
CREATE OR REPLACE PROCEDURE send_mail_2(
IN p_sender VARCHAR(4096), 
IN p_recipient VARCHAR(4096), 
IN p_subj VARCHAR(4096), 
IN p_msg VARCHAR(4096), 
IN p_mailhost VARCHAR(4096)) SPECIFIC send_mail_2
LANGUAGE SQL
BEGIN
  DECLARE v_conn UTL_SMTP.CONNECTION;
  DECLARE v_crlf VARCHAR(2);
  DECLARE v_port INTEGER CONSTANT 25;

  SET v_crlf = CHR(13) || CHR(10);
  SET v_conn = UTL_SMTP.OPEN_CONNECTION(p_mailhost, v_port, 10);
  CALL UTL_SMTP.HELO(v_conn, p_mailhost);
  CALL UTL_SMTP.MAIL(v_conn, p_sender);
  CALL UTL_SMTP.RCPT(v_conn, p_recipient);
  CALL UTL_SMTP.OPEN_DATA(v_conn);
  CALL UTL_SMTP.WRITE_DATA(v_conn, 'From: ' || p_sender || v_crlf);
  CALL UTL_SMTP.WRITE_DATA(v_conn, 'To: ' || p_recipient || v_crlf);
  CALL UTL_SMTP.WRITE_DATA(v_conn, 'Subject: ' || p_subj || v_crlf);
  CALL UTL_SMTP.WRITE_DATA(v_conn, v_crlf || p_msg);
  CALL UTL_SMTP.CLOSE_DATA(v_conn);
  CALL UTL_SMTP.QUIT(v_conn);
END@

CALL send_mail_2('bwayne@mycorp.com','pparker@mycorp.com','Holiday Party',
'Are you planning to attend?','smtp.mycorp.com')@