273 UTL_SMTP

UTL_SMTPパッケージは、RFC821で定められたSimple Mail Transfer Protocol(SMTP)による電子メール送信ができるように設計されています。

この章のトピックは、次のとおりです:

273.1 UTL_SMTPの概要

UTL_SMTPのプロトコルは、電子メール・クライアントからSMTPサーバーに電子メールを伝送するための一連のコマンドで構成されています。UTL_SMTPパッケージでは、SMTPコマンドへのインタフェースを提供します。

このパッケージには、多くのコマンドで利用できるプロシージャ形式およびファンクション形式のインタフェースが用意されています。ファンクション形式の場合、クライアントで処理するための応答はサーバーから戻されます。プロシージャ形式の場合は応答がチェックされ、一時的なエラー(400番台の応答コード)または永続的なエラー(500番台の応答コード)を示す応答のときには例外が発生します。そうでない場合は、応答を破棄します。

オリジナルのSMTPプロトコルによる通信には、7ビットASCIIが使用されることに注意してください。UTL_SMTPを使用すると、すべてのテキスト・データ(つまり、VARCHAR2のデータ)は、サーバーに送信される前にUS7ASCIIに変換されます。SMTP拡張8BITMIME [RFC1652]をサポートしているSMTPサーバーの実装の一部は、クライアントとサーバーの間の完全8ビット通信をサポートしています。DATAコマンドの本体は完全8ビットで転送できますが、それ以外のSMTPのコマンドと応答は7ビットである必要があります。ターゲットのSMTPサーバーが8BITMIME拡張要素をサポートしている場合、マルチバイト・データベースのユーザーは、非US7ASCIIのマルチバイトVARCHAR2データをRAWに変換し、WRITE_RAW_DATAサブプログラムを使用して8ビットMIMEのエンコーディングを使用したマルチバイト・データを送信できます。

UTL_SMTPでは、RFC 821に指定されているSMTP通信が提供されますが、メッセージの内容をRFC 822に従って書式設定するためのAPI(電子メールの件名の設定など)は提供していません。メッセージの適切な書式設定は、ユーザー各自で行ってください。また、UTL_SMTPは、SMTPを使用して電子メールを送信するように、SMTPサーバーをメール・クライアントに実装する機能は備えていません。

273.2 UTL_SMTPのセキュリティ・モデル

このパッケージは実行者権限のパッケージです。起動するユーザーには、接続する必要のあるリモート・ネットワーク・ホストに割り当てられたアクセス制御リストでconnect権限が付与されている必要があります。

ノート:

ファイングレイン・アクセスの管理の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。

273.3 UTL_SMTPの定数

UTL_SMTPは、パラメータ値の指定時に使用するいくつかの定数を定義します。

これらを、次の表に示します。

表273-1 UTL_SMTPの定数

名前 タイプ 説明

ALL_SCHEMES

VARCHAR2(256)

'CRAM-MD5 PLAIN LOGIN'

UTL_SMTPでサポートされるすべての認証方式のリスト(相対セキュリティ強度順)。クリアテキスト・パスワードがSMTPを通じて送信されるALL_SCHEMES各方式のサブセット(具体的にはPLAINおよびLOGIN)は、Secure Sockets Layer / Transport Layer Security(SSL/TLS)によって保護されたSMTP接続でのみ使用する必要があります。

NON_CLEARTEXT_PASSWORD_SCHEMES

VARCHAR2(256)

'CRAM-MD5'

UTL_SMTPでサポートされ、クリアテキスト・パスワードがSMTPを通じて送信されない認証方式のリスト。これらの方式は、SSL/TLSによって保護されないSMTP接続で使用できます。ただし、これらの方式は、セキュアではないSMTP接続で使用する場合、依然として脆弱である可能性があります。

273.4 UTL_SMTPのタイプ

UTL_SMTPは、CONNECTIONレコード・タイプおよびREPLY_REPLIESレコード・タイプを使用します。

CONNECTIONレコード・タイプ

SMTP接続を示すPL/SQLレコード・タイプです。

構文

TYPE connection IS RECORD (
    host              VARCHAR2(255),
    port              PLS_INTEGER,
    tx_timeout        PLS_INTEGER, 
    private_tcp_con   utl_tcp.connection,
    private_state     PLS_INTEGER);

フィールド

表273-2 CONNECTIONレコード・タイプのフィールド

フィールド 説明

host

接続が確立したときのリモート・ホストの名前。接続が確立されない場合はNULLです。

port

接続したリモートSMTPサーバーのポート番号。接続が確立されない場合はNULLです。

tx_timeout

この接続で読取りまたは書込み操作を中止するまでのUTL_SMTPパッケージの待機時間(秒)。読取り操作の場合、読み取れるデータがない場合に操作が即座に中止されます。書込み操作の場合、出力バッファがフルで、ブロックされずにネットワークに送信できるデータがない場合に操作が中止されます。0 (ゼロ)は、まったく待機しないことを示します。NULLは、無期限に待機することを示します。

private_tcp_con

実装目的でのみ使用されるプライベートのパラメータ。このフィールドは変更しないでください。

private_state

実装目的でのみ使用されるプライベートのパラメータ。このフィールドは変更しないでください。

使用上のノート

接続レコードの読取り専用フィールドは、OPEN_CONNECTIONファンクションを使用して接続に成功した後、SMTP接続の情報を戻すために使用されます。これらのフィールドを変更しても、接続には影響ありません。private_tcp_conフィールドおよびprivate_stateフィールドは、実装目的にのみ使用されます。これらのフィールドは変更しないでください。

REPLY_REPLIESレコード・タイプ

SMTP応答行を示すPL/SQLレコード・タイプです。各SMTP応答行は、応答コードとそれに続くテキスト・メッセージで構成されています。大半のSMTPコマンドに対しては単一の応答行ですが、一部のSMTPコマンドに対しては複数の応答行となります。このような場合は、複数の応答行を示すために応答レコードのPL/SQL表が使用されます。

構文

TYPE reply IS RECORD (
  code    PLS_INTEGER,
  text    VARCHAR2(508));

TYPE replies IS TABLE OF reply INDEX BY BINARY_INTEGER; 

フィールド

表273-3 reply、repliesレコード・タイプのフィールド

フィールド 説明

code

3桁の応答コード。

text

応答のテキスト・メッセージ。

273.5 UTL_SMTPの応答コード

SMTPサーバーは、メッセージまたはサーバー・ステータスを示す応答コードを送信します。

次のリストにSMTP応答コードを示します。

表273-4 SMTP応答コード

応答コード 意味

211

システム・ステータスまたはシステム・ヘルプの応答です。

214

ヘルプ・メッセージ(使用方法や特定の非標準コマンドの意味に関する情報で、この応答は人間であるユーザーにのみ有用です)。

220

<domain> サービスは準備完了です。

221

<domain>サービスは送信チャネルをクローズしています。

250

要求したメール・アクションは正常で、完了しました。

251

ユーザーがローカルではありません。<forward-path>にフォワードします。

252

OK。ノード<node>に対する保留中のメッセージが開始されました。ユーザーをVRFYできません(情報がローカルにないなど)が、このユーザーへのメッセージを送信しようとします。

253

OK。ノード<node>に対する保留中のメッセージ<messages>が開始されました。

354

メール入力を開始し、<CRLF.CRLF>で終了します。

355

オクテット・オフセットは、トランザクション・オフセットです。

421

<domain>サービスが使用不可のため、送信チャネルをクローズしています(サービスのシャットダウンが必要な場合には、すべてのコマンドに対してこの応答が使用される可能性があります)。

450

要求したメール・アクションが実行されていません。メールボックスは使用不可です(メールボックス・ビジーなど)。

451

要求したアクションが終了しました。処理中にローカル・エラーが発生しました。

452

要求したアクションが実行されていません。システム記憶域不足です。

453

電子メールがありません。

454

一時的にTLSを使用できません。要求した認証メカニズムには暗号化が必要です。

458

ノード<node>に対してメッセージをキューできません。

459

ノード<node>は許可されていません。理由

500

構文エラーのため、コマンドを認識できません(コマンドラインが長すぎるなどのエラーも含まれます)。

501

パラメータまたは引数に構文エラーがあります。

502

コマンドが実装されていません。

503

コマンドの順序が不正です。

504

コマンド・パラメータが実装されていません。

521

<Machine>がメールを受け入れません。

530

STARTTLSコマンドを最初に発行する必要があります。要求した認証メカニズムには暗号化が必要です。

534

認証メカニズムが脆弱です。

538

要求した認証メカニズムには暗号化が必要です。

550

要求したアクションが実行されていません。メールボックスは使用不可です(メールボックスが見つからない、アクセスできないなど)。

551

ユーザーがローカルではありません。<forward-path>を試行してください。

552

要求したメール・アクションが終了しました。記憶域の割当て超過です。

553

要求したアクションが実行されていません。メールボックス名が使用不可です(メールボックスの構文が正しくないなど)。

554

トランザクションに失敗しました。

273.6 UTL_SMTPの操作上のノート

SMTP接続は、SMTP接続を戻すOPEN_CONNECTIONファンクションのコールによって開始されます。

接続の確立後、メールを送信するには、次のコールが必要です。

HELOファンクションおよびプロシージャ: 送信元のドメインを識別します。

MAILファンクションおよびプロシージャ: メールを開始し、送信元を指定します。

RCPTファンクション: 受信者を指定します。

OPEN_DATAファンクションおよびプロシージャ: メールの本文を開始します。

WRITE_RAW_DATAプロシージャ: メールの本文を書き込みます(複数のコール可)。

CLOSE_DATAファンクションおよびプロシージャ: メールの本文を閉じて、メールを送信します。

SMTP接続を終了するには、QUITファンクションおよびプロシージャをコールします。

273.7 UTL_SMTPの例外

次の表に、UTL_SMTPパッケージのインタフェースが呼び出す可能性のある例外を示します。

ネットワーク・エラーは、応答コード421(サービスは使用不可)になります。

表273-5 UTL_SMTPの例外

例外 説明

INVALID_OPERATION

無効な操作が行われたときに呼び出されます。つまり、OPEN_DATAファンクションおよびプロシージャをコールした後に、WRITE_DATAプロシージャWRITE_RAW_DATAプロシージャまたはCLOSE_DATAファンクションおよびプロシージャ以外のAPIをコールすることや、最初にOPEN_DATAをコールせずにWRITE_DATA、WRITE_RAW_DATAまたはCLOSE_DATAをコールすることです。

TRANSIENT_ERROR

400番台の応答コードを受け取った場合に呼び出されます。

PERMANENT_ERROR

500番台の応答コードを受け取った場合に呼び出されます。

273.8 UTL_SMTPのルールおよび制限

このAPIによって課される制限または範囲チェックはありません。ただし、SMTPの各種要素については、制限に注意する必要があります。制限を超えるデータが送信されると、サーバーからエラーが戻ります。

次の表は、UTL_SMTPサブプログラムでのサイズ制限について説明しています。

表273-6 SMTPのサイズ制限

要素 サイズ制限

user

ユーザー名の最大合計長は、64文字です。

domain

ドメイン名またはドメイン番号の最大合計長は、64文字です。

path

reverse-pathまたはforward-pathの最大合計長は256文字です(句読点と要素のセパレータも含む)。

command line

コマンド自体と<CRLF>も含めたコマンドラインの最大合計長は、512文字です。

reply line

応答コードと<CRLF>も含めた応答行の最大合計長は、512文字です。

text line

<CRLF>を含めたテキスト行の最大合計長は、1000文字です(ただし、透過性に必要な先行ドットはカウントされません)。

recipients buffer

バッファリングを要する受信者の最大合計数は、100です。

273.9 UTL_SMTPの例

次の例では、アプリケーションでUTL_SMTPを使用して電子メールを送信する方法を示します。ポート25でSMTPサーバーに接続し、簡単なテキスト・メッセージを送信します。

DECLARE
  c UTL_SMTP.CONNECTION;
 
  PROCEDURE send_header(name IN VARCHAR2, header IN VARCHAR2) AS
  BEGIN
    UTL_SMTP.WRITE_DATA(c, name || ': ' || header || UTL_TCP.CRLF);
  END;
 
BEGIN
  c := UTL_SMTP.OPEN_CONNECTION('smtp-server.acme.com');
  UTL_SMTP.HELO(c, 'foo.com');
  UTL_SMTP.MAIL(c, 'sender@foo.com');
  UTL_SMTP.RCPT(c, 'recipient@foo.com');
  UTL_SMTP.OPEN_DATA(c);
  send_header('From',    '"Sender" <sender@foo.com>');
  send_header('To',      '"Recipient" <recipient@foo.com>');
  send_header('Subject', 'Hello');
  UTL_SMTP.WRITE_DATA(c, UTL_TCP.CRLF || 'Hello, world!');
  UTL_SMTP.CLOSE_DATA(c);
  UTL_SMTP.QUIT(c);
EXCEPTION
  WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN
    BEGIN
      UTL_SMTP.QUIT(c);
    EXCEPTION
      WHEN UTL_SMTP.TRANSIENT_ERROR OR UTL_SMTP.PERMANENT_ERROR THEN
        NULL; -- When the SMTP server is down or unavailable, we don't have
              -- a connection to the server. The QUIT call raises an
              -- exception that we can ignore.
    END;
    raise_application_error(-20000,
      'Failed to send mail due to the following error: ' || sqlerrm);
END;

273.10 UTL_SMTPサブプログラムの要約

この表は、UTL_SMTPサブプログラムを示し、簡単に説明しています。

表273-7 UTL_SMTPパッケージのサブプログラム

サブプログラム 説明

AUTHファンクションおよびプロシージャ

AUTHコマンドを送信して、SMTPサーバーに対する認証を行います。

CLOSE_CONNECTIONプロシージャ

SMTP接続をクローズして、現行のSMTP操作を終了します。

CLOSE_DATAファンクションおよびプロシージャ

データ・セッションをクローズします。

COMMANDファンクションおよびプロシージャ

一般的なSMTPコマンドを実行します。

COMMAND_REPLIESファンクション

一般的なSMTPコマンドを実行して、複数の応答行を取得します。

DATAファンクションおよびプロシージャ

電子メール本文を送信します。

EHLOファンクションおよびプロシージャ

EHLOコマンドを使用してSMTPサーバーとの初期ハンドシェイクを実行します。

HELOファンクションおよびプロシージャ

HELOコマンドを使用してSMTPサーバーとの初期ハンドシェイクを実行します。

HELPファンクション

HELPコマンドを送信します。

MAILファンクションおよびプロシージャ

サーバーとの電子メール・トランザクションを開始します。宛先はメールボックスです。

NOOPファンクションおよびプロシージャ

NULLコマンド

OPEN_CONNECTIONファンクション

SMTPサーバーへの接続をオープンします。

OPEN_DATAファンクションおよびプロシージャ

DATAコマンドを送信します。

QUITファンクションおよびプロシージャ

SMTPセッションを終了し、サーバーとの接続を切断します。

RCPTファンクション

電子メール・メッセージの受信者を指定します。

RSETファンクションおよびプロシージャ

現行の電子メール・トランザクションを終了します。

STARTTLSファンクションおよびプロシージャ

STARTTLSコマンドを送信し、SSL/TLSを使用してSMTP接続を保護します。

VRFYファンクション

宛先の電子メール・アドレスの妥当性を検証します。

WRITE_DATAプロシージャ

電子メール・メッセージの一部を書き込みます。

WRITE_RAW_DATAプロシージャ

RAWデータを使用して電子メール・メッセージの一部を書き込みます。

273.10.1 AUTHファンクションおよびプロシージャ

このサブプログラムは、AUTHコマンドを送信して、SMTPサーバーに対する認証を行います。UTL_SMTPパッケージは、ユーザー選択の認証方式を確認し、SMTPサーバーでサポートされない方式をスキップして、サポートされる最初の方式を使用します。

SMTPサーバーでサポートされる方式をEHLO応答から判断するには、EHLOファンクションおよびプロシージャをコールする必要があります。それ以外の場合、UTL_SMTPでは、リストの最初の方式が使用されます。

構文

UTL_SMTP.AUTH (
   c          IN OUT NOCOPY connection,
   username   IN            VARCHAR2,
   password   IN            VARCHAR2,
   schemes    IN            VARCHAR2 DEFAULT NON_CLEARTEXT_PASSWORD_SCHEMES)
 RETURN reply;

UTL_SMTP.AUTH (
   c          IN OUT NOCOPY connection,
   username   IN            VARCHAR2,
   password   IN            VARCHAR2,
   schemes    IN            VARCHAR2 DEFAULT NON_CLEARTEXT_PASSWORD_SCHEMES);

パラメータ

表273-8 AUTHファンクションおよびプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

username

ユーザー名。

password

パスワード。

schemes

UTL_SMTPでの使用を許可する認証方式のスペース区切りのリスト(優先度順)。詳細は、ALL_SCHEMES定数およびNON_CLEARTEXT_PASSWORD_SCHEMES定数を参照してください。

戻り値

表273-9 AUTHファンクションおよびプロシージャ・ファンクションの戻り値

戻り値 説明

reply

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。

使用上のノート

  • 現在、UTL_SMTPでサポートされる認証方式は、PLAINLOGINおよびCRAM-MD5のみです。

  • SMTPサーバーでは、STARTTLSコマンドを実行してSSL/TLSによってSMTP接続を保護した後に、サポートされる認証方式が変更される可能性があるため(PLAINLOGINの追加など)、コール元では、STARTTLSファンクションおよびプロシージャをコールした後、UTL_SMTPで再度EHLOファンクションおよびプロシージャをコールしてリストを更新する必要があります。

DECLARE
  c utl_smtp.connection;
BEGIN
  c := utl_smtp.open_connection(
      host => 'smtp.example.com',
      port => 25,
      wallet_path => 'file:/oracle/wallets/smtp_wallet',
      wallet_password => 'password',
      secure_connection_before_smtp => FALSE);
  UTL_SMTP.STARTTLS(c);
  UTL_SMTP.AUTH(
      c => c,
      username => 'scott',
      password => 'password'
      schemes  => utl_smtp.all_schemes);
END;

273.10.2 CLOSE_CONNECTIONプロシージャ

このプロシージャは、SMTP接続をクローズして、現行のSMTP操作を終了します。データ・セッション中に電子メールを取り消す場合にのみ、このプロシージャを使用してください。

SMTP接続を正常に終了させるには、QUITファンクションおよびプロシージャを使用します。

構文

UTL_SMTP.CLOSE_CONNECTION (
   c     IN OUT NOCOPY connection);

パラメータ

表273-10 CLOSE_CONNECTIONプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

273.10.3 CLOSE_DATAファンクションおよびプロシージャ

このサブプログラムは、<CR><LF>.<CR><LF>(行の開始はシングル・ピリオド)の順序で送信することにより、電子メール・メッセージを終了します。

構文

UTL_SMTP.CLOSE_DATA (
   c     IN OUT NOCOPY connection) 
RETURN reply;

UTL_SMTP.CLOSE_DATA (
   c     IN OUT NOCOPY connection);

パラメータ

表273-11 CLOSE_DATAファンクションおよびプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

戻り値

表273-12 CLOSE_DATAファンクションおよびプロシージャの戻り値

戻り値 説明

reply

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。

使用上のノート

OPEN_DATAWRITE_DATAWRITE_RAW_DATAおよびCLOSE_DATAへのコールは、正しい順序で実行する必要があります。プログラムは、DATAコマンドをSMTPサーバーに送信するためにOPEN_DATAをコールします。次に、実際のデータを送信するために、WRITE_DATAまたはWRITE_RAW_DATAを繰り返しコールできます。データは、CLOSE_DATAをコールして終了します。OPEN_DATAがコールされた後にコールできるサブプログラムは、WRITE_DATAWRITE_RAW_DATAまたはCLOSE_DATAのみです。他のサブプログラムのコールは、INVALID_OPERATION例外の発生原因となります。

CLOSE_DATAは、OPEN_CONNECTIONHELOまたはEHLOMAILおよびRCPTがコールされた後にコールする必要があります。このルーチンがコールされるときは、SMTPサーバーへの接続がオープン状態で、メール・トランザクションがアクティブ状態である必要があります。

SMTPサーバーからの応答は、CLOSE_DATAへのコール中にデータの終了が送信されるまで行われないため、WRITE_DATAのファンクション形式は存在しないことに注意してください。

273.10.4 COMMANDファンクションおよびプロシージャ

このサブプログラムは、一般的なSMTPコマンドを実行します。

構文

UTL_SMTP.COMMAND (
   c     IN OUT NOCOPY    connection,
   cmd   IN               VARCHAR2,
   arg   IN               VARCHAR2 DEFAULT NULL)
RETURN reply;

UTL_SMTP.COMMAND (
   c     IN OUT NOCOPY    connection,
   cmd   IN               VARCHAR2,
   arg   IN               VARCHAR2 DEFAULT NULL);

パラメータ

表273-13 COMMANDファンクションおよびプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

cmd

サーバーに送信するSMTPコマンド。

arg

SMTP引数へのオプション引数。cmdargの間に空白が挿入されます。

戻り値

表273-14 COMMANDファンクションおよびプロシージャの戻り値

戻り値 説明

reply

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。

使用上のノート

このファンクションは、一般的なSMTPコマンドを起動するために使用されます。COMMANDは、単一の応答行が予想される場合にのみ使用します。複数の応答行が予想される場合は、COMMAND_REPLIESを使用します。

COMMANDは、SMTPサーバーからの応答が複数行ある場合、最終応答行のみを戻します。

273.10.5 COMMAND_REPLIESファンクション

このファンクションは、一般的なSMTPコマンドを実行して、複数の応答行を取得します。

構文

UTL_SMTP.COMMAND_REPLIES (
   c     IN OUT NOCOPY    connection,
   cmd   IN               VARCHAR2,
   arg   IN               VARCHAR2 DEFAULT NULL)
RETURN replies;

パラメータ

表273-15 COMMAND_REPLIESファンクションのパラメータ

パラメータ 説明

c

SMTP接続。

cmd

サーバーに送信するSMTPコマンド。

arg

SMTP引数へのオプション引数。cmdargの間に空白が挿入されます。

戻り値

表273-16 COMMAND_REPLIESファンクションの戻り値

戻り値 説明

replies

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。

使用上のノート

このファンクションは、一般的なSMTPコマンドを起動するために使用されます。COMMANDは、単一の応答行が予想される場合にのみ使用します。複数の応答行が予想される場合は、COMMAND_REPLIESを使用します。

COMMANDは、SMTPサーバーからの応答が複数行ある場合、最終応答行のみを戻します。

273.10.6 DATAファンクションおよびプロシージャ

このサブプログラムは、電子メール・メッセージの本文を指定します。

構文

UTL_SMTP.DATA (
   c     IN OUT NOCOPY connection
   body  IN  VARCHAR2 CHARACTER SET ANY_CS) 
RETURN reply;

UTL_SMTP.DATA (
   c     IN OUT NOCOPY connection
   body  IN VARCHAR2 CHARACTER SET ANY_CS);

パラメータ

表273-17 DATAファンクションおよびプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

body

送信するメッセージのヘッダーを含めたテキスト([RFC822]形式)。

戻り値

表273-18 DATAファンクションおよびプロシージャの戻り値

戻り値 説明

reply

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。

使用上のノート

bodyパラメータの内容がMIME(RFC822)の仕様に準拠していることをアプリケーションは確認する必要があります。DATAルーチンは、RFC821の要求に従って、<CR><LF>.<CR><LF>の順序で(行の開始はシングル・ピリオド)メッセージを終了します。また、bodyの<CR><LF>.<CR><LF> (シングル・ピリオド)の順序を<CR><LF>..<CR><LF> (ダブル・ピリオド)に変換します。この変換によって、RFC821のセクション4.5.2に記述されている透過性が提供されます。

DATAサブプログラムは、OPEN_CONNECTIONHELOまたはEHLOMAILおよびRCPTがコールされた後にコールする必要があります。このルーチンがコールされるときは、SMTPサーバーへの接続がオープン状態で、メール・トランザクションがアクティブ状態である必要があります。

サーバーからの応答は、ステータス・コード250で開始するメッセージになります。初期DATAコマンドから受信した354という応答は、コール元に戻されません。

273.10.7 EHLOファンクションおよびプロシージャ

このサブプログラムは、EHLOコマンドを使用してSMTPサーバーとの初期ハンドシェイクを実行します。

構文

UTL_SMTP.EHLO (
   c       IN OUT NOCOPY connection, 
   domain  IN) 
RETURN replies;

UTL_SMTP.EHLO (
   c       IN OUT NOCOPY connection, 
   domain  IN);

パラメータ

表273-19 EHLOファンクションおよびプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

domain

ローカル(送信側)ホストのドメイン名。識別の目的で使用されます。

戻り値

表273-20 EHLOファンクションおよびプロシージャの戻り値

戻り値 説明

replies

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。

使用上のノート

EHLOのインタフェースは、サーバーがその構成に関するより多くの詳細な情報を戻せることを除くとHELOと同じです。[RFC1869]には、戻される情報の書式が指定されています。書式は、PL/SQLアプリケーションでこのコールのファンクション形式を使用して取り出すことができます。HELOとの互換性のために、サーバーが戻すテキストの各行はステータス・コード250で開始されます。

273.10.8 HELOファンクションおよびプロシージャ

このサブプログラムは、HELOコマンドを使用してSMTPサーバーとの初期ハンドシェイクを実行します。

構文

UTL_SMTP.HELO (
   c       IN OUT NOCOPY   connection, 
   domain  IN              VARCHAR2) 
RETURN reply;

UTL_SMTP.HELO (
   c       IN OUT NOCOPY   connection, 
   domain  IN              VARCHAR2);

パラメータ

表273-21 HELOファンクションおよびプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

domain

ローカル(送信側)ホストのドメイン名。識別の目的で使用されます。

戻り値

表273-22 HELOファンクションおよびプロシージャの戻り値

戻り値 説明

reply

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。

使用上のノート

RFC 821では、接続した後でクライアントはサーバーに対してクライアント自体を識別する必要があると指定されています。このルーチンは、その識別を実行します。このルーチンをコールする前に、OPEN_CONNECTIONファンクションをコールして接続をオープンにしておく必要があります。

サーバーからの応答は、ステータス・コード250で開始するメッセージになります。

273.10.9 HELPファンクション

このファンクションは、HELPコマンドを送信します。

構文

UTL_SMTP.HELP (
   c         IN OUT NOCOPY   connection, 
   command   IN              VARCHAR2 DEFAULT NULL) 
RETURN replies;

パラメータ

表273-23 HELPファンクションのパラメータ

パラメータ 説明

c

SMTP接続。

command

ヘルプ・メッセージを取得するコマンド。

戻り値

表273-24 HELPファンクションの戻り値

戻り値 説明

replies

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。

273.10.10 MAILファンクションおよびプロシージャ

このサブプログラムは、サーバーとのメール・トランザクションを開始します。宛先はメールボックスです。

構文

UTL_SMTP.MAIL (
   c           IN OUT NOCOPY   connection, 
   sender      IN              VARCHAR2, 
   parameters  IN              VARCHAR2 DEFAULT NULL) 
RETURN reply;

UTL_SMTP.MAIL (
   c           IN OUT NOCOPY   connection, 
   sender      IN              VARCHAR2, 
   parameters  IN              VARCHAR2 DEFAULT NULL);

パラメータ

表273-25 MAILファンクションおよびプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

sender

メッセージを送信するユーザーの電子メール・アドレス。

parameters

[RFC1869]のセクション6に定義されているmailコマンドへの追加パラメータ。XXX=XXX (XXX=XXX ....)の形式に従う必要があります。

戻り値

表273-26 MAILファンクションおよびプロシージャの戻り値

戻り値 説明

reply

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。

使用上のノート

このコマンドはメッセージを送信しません。準備を開始するのみです。トランザクションを完了するには、RCPTおよびDATAへのコールを後に続ける必要があります。SMTPサーバーへの接続はオープン状態で、HELOまたはEHLOコマンドはすでに送信されている必要があります。

サーバーからの応答は、ステータス・コード250で開始するメッセージになります。

273.10.11 NOOPファンクションおよびプロシージャ

このサブプログラムは、NULLコマンドを発行します。

構文

UTL_SMTP.NOOP (
   c  IN OUT NOCOPY connection) 
RETURN reply;

UTL_SMTP.NOOP (
   c  IN OUT NOCOPY connection);

パラメータ

表273-27 NOOPファンクションおよびプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

戻り値

表273-28 NOOPファンクションおよびプロシージャの戻り値

戻り値 説明

reply

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。

使用上のノート

  • このコマンドは、サーバーから正常な応答を引き出すことにのみ有効です。OPEN_CONNECTIONでサーバーへの接続を確立した後は、いつでもこのコマンドを発行できます。NOOPコマンドは、サーバーが接続され、正しくリスニングが行われていることを検証するために使用します。

  • このコマンドの応答は、ステータス・コード250で開始する単一の行になります。

273.10.12 OPEN_CONNECTIONファンクション

このファンクションは、SMTPサーバーへの接続をオープンします。

構文

UTL_SMTP.OPEN_CONNECTION (
   host                            IN  VARCHAR2, 
   port                            IN  PLS_INTEGER DEFAULT 25, 
   c                               OUT connection, 
   tx_timeout                      IN  PLS_INTEGER DEFAULT NULL,
   wallet_path                     IN  VARCHAR2 DEFAULT NULL,
   wallet_password                 IN  VARCHAR2 DEFAULT NULL, 
   secure_connection_before_smtp   IN  BOOLEAN DEFAULT FALSE,
   secure_host                     IN  VARCHAR2 DEFAULT NULL)
 RETURN reply; 

UTL_SMTP.OPEN_CONNECTION (
   host                           IN  VARCHAR2, 
   port                           IN  PLS_INTEGER DEFAULT 25, 
   tx_timeout                     IN  PLS_INTEGER DEFAULT NULL,
   wallet_path                    IN  VARCHAR2 DEFAULT NULL,
   wallet_password                IN  VARCHAR2 DEFAULT NULL, 
   secure_connection_before_smtp  IN  BOOLEAN DEFAULT FALSE,
   secure_host                    IN  VARCHAR2 DEFAULT NULL) 
RETURN connection; 

パラメータ

表273-29 OPEN_CONNECTIONファンクションのパラメータ

パラメータ 説明

host

SMTPサーバーのホストの名前。

port

SMTPサーバーがリスニングするポート番号(通常は25)。

c

SMTP接続。

tx_timeout

この接続で読取りまたは書込み操作を中止するまでのUTL_SMTPパッケージの待機時間(秒)。読取り操作の場合、読み取れるデータがない場合に操作が即座に中止されます。書込み操作の場合、出力バッファがフルで、ブロックされずにネットワークに送信できるデータがない場合に操作が中止されます。0 (ゼロ)は、まったく待機しないことを示します。NULLは、無期限に待機することを示します。

wallet_path

SSL/TLS用のOracle Walletを含むディレクトリ・パス。形式はfile: <directory-path>です。

wallet_password

Walletをオープンするためのパスワード。Walletの自動ログインが有効の場合は、パスワードをNULLに設定できます。

secure_connection_before_smtp

TRUEの場合、SMTP通信の前にSSL/TLSによるセキュアな接続が確立されます。FALSEの場合、接続は確立されません。

secure_host

セキュアな接続が使用されるときにSMTPサーバーの証明書の共通名(CN)と照合するホスト名。これは、"*.example.com"のようなドメイン名の場合もあります。

NULLの場合、接続先のSMTPホスト名が使用されます。

戻り値

表273-30 OPEN_CONNECTIONファンクションの戻り値

戻り値 説明

reply

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。

使用上のノート

  • サーバーからの応答は、ステータス・コード220で開始するメッセージになります。

  • UTL_SMTP.CONNECTIONを戻すOPEN_CONNECTIONのバージョンでは、接続が初めて確立した時点でSMTPサーバーから戻される応答コードをチェックします。応答がエラーを示した場合は、例外が発生します。そうでない場合は、応答を破棄します。応答を調べるには、REPLYを戻すOPEN_CONNECTIONを起動します。

  • tx_timeoutは、読込み操作および書込み操作の両方を制御するものです。ただし、現行のリリースでは実装が制限されているため、tx_timeoutによる書込み操作の制御は行われません。

DECLARE
  c utl_smtp.connection;
BEGIN
  c := UTL_SMTP.OPEN_CONNECTION(
   host => 'smtp.example.com',
   port => 465,
   wallet_path => 'file:/oracle/wallets/smtp_wallet',
   wallet_password => 'password',
   secure_connection_before_smtp => TRUE);
END;

273.10.13 OPEN_DATAファンクションおよびプロシージャ

このサブプログラムは、DATAコマンドを送信し、その後、WRITE_DATAおよびWRITE_RAW_DATAで電子メール・メッセージの一部を書き込みます。

構文

UTL_SMTP.OPEN_DATA (
   c     IN OUT NOCOPY connection) 
RETURN reply;

UTL_SMTP.OPEN_DATA (
   c     IN OUT NOCOPY connection);

パラメータ

表273-31 OPEN_DATAファンクションおよびプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

data

送信するメッセージのヘッダーを含めたテキストの一部(RFC822形式)。

戻り値

表273-32 OPEN_DATAファンクションおよびプロシージャ・ファンクションの戻り値

戻り値 説明

reply

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。

使用上のノート

  • OPEN_DATAWRITE_DATAWRITE_RAW_DATAおよびCLOSE_DATAへのコールは、正しい順序で実行する必要があります。プログラムは、DATAコマンドをSMTPサーバーに送信するためにOPEN_DATAをコールします。次に、実際のデータを送信するために、WRITE_DATAまたはWRITE_RAW_DATAを繰り返しコールできます。データは、CLOSE_DATAをコールして終了します。OPEN_DATAがコールされた後にコールできるサブプログラムは、WRITE_DATAWRITE_RAW_DATAまたはCLOSE_DATAのみです。他のサブプログラムのコールは、INVALID_OPERATION例外の発生原因となります。

  • OPEN_DATAは、OPEN_CONNECTIONHELOまたはEHLOMAILおよびRCPTがコールされた後にコールする必要があります。このルーチンがコールされるときは、SMTPサーバーへの接続がオープン状態で、メール・トランザクションがアクティブ状態である必要があります。

273.10.14 QUITファンクションおよびプロシージャ

このサブプログラムは、SMTPセッションを終了し、サーバーとの接続を切断します。

構文

UTL_SMTP.QUIT (
   c  IN OUT NOCOPY connection) 
RETURN reply;

UTL_SMTP.QUIT (
   c  IN OUT NOCOPY connection);

パラメータ

表273-33 QUITファンクションおよびプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

戻り値

表273-34 QUITファンクションおよびプロシージャ・ファンクションの戻り値

戻り値 説明

reply

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。

使用上のノート

QUITコマンドは、セッションを終了するというクライアントの意図をSMTPサーバーに伝えます。伝えた後に、OPEN_CONNECTIONで確立した接続をクローズします。このOPEN_CONNECTIONは、このコマンドの実行前にコールされている必要があります。QUITの発行時にメール・トランザクションが進行中の場合は、RSETと同様に放棄されます。

このコマンドのファンクション形式は、正常終了時にステータス・コード221で開始する単一の行を戻します。SMTPサーバーへの接続は、どのような場合にもクローズされます。cREMOTE_HOSTおよびREMOTE_PORTフィールドはリセットされます。

273.10.15 RCPTファンクション

このサブプログラムは、電子メール・メッセージの受信者を指定します。

構文

UTL_SMTP.RCPT (
   c           IN OUT NOCOPY     connection,
   recipient   IN                VARCHAR2,
   parameters  IN                VARCHAR2 DEFAULT NULL)
RETURN reply;

UTL_SMTP.RCPT (
   c           IN OUT NOCOPY     connection,
   recipient   IN                VARCHAR2,
   parameters  IN                VARCHAR2 DEFAULT NULL);

表273-35 RCPTファンクションおよびプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

recipient

メッセージの送信先ユーザーの電子メール・アドレス。

parameters

[RFC1869]のセクション6に定義されているRCPTコマンドへの追加パラメータ。XXX=XXX (XXX=XXX ....)の形式に従う必要があります。

戻り値

表273-36 RCPTファンクションおよびプロシージャ・ファンクションの戻り値

戻り値 説明

reply

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。

使用上のノート

複数の受信者にメッセージを送信するには、このルーチンを複数回コールします。各起動で1つの電子メール・アドレスへの配信がスケジュールされます。メッセージ・トランザクションは、先行するMAILへのコールによって開始されており、メール・サーバーへの接続はすでにオープン状態にあり、先行するOPEN_CONNECTIONおよびHELOまたはEHLOへのコールによってそれぞれ初期化されている必要があります。

サーバーからの応答は、ステータス・コード250または251で開始するメッセージになります。

273.10.16 RSETファンクションおよびプロシージャ

このサブプログラムは、現行のメール・トランザクションを終了します。

構文

UTL_SMTP.RSET (
   c  IN OUT NOCOPY connection) 
RETURN reply;

UTL_SMTP.RSET (
   c  IN OUT NOCOPY connection);

パラメータ

表273-37 RSETファンクションおよびプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

戻り値

表273-38 RSETファンクションおよびプロシージャの戻り値

戻り値 説明

reply

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。

使用上のノート

  • このコマンドによって、クライアントは構成処理中の電子メール・メッセージを取り消すことができます。メールは送信されません。クライアントは、SMTPサーバーへの接続がOPEN_CONNECTIONでオープンされた後は、DATAまたはOPEN_DATAがコールされるまで、いつでもRSETをコールできます。ただし、電子メール・データの送信が始まってしまった後では、その送信を中止できません。

  • サーバーは、RSETに対してステータス・コード250で開始するメッセージで応答します。

273.10.17 STARTTLSファンクションおよびプロシージャ

このサブプログラムは、STARTTLSコマンドを送信し、SSL/TLSを使用してSMTP接続を保護します。

SSL/TLSでは、OPEN_CONNECTIONファンクションによる接続のオープン時に指定する必要のあるOracle Walletが要求されます。

構文

UTL_SMTP.STARTTLS (
   c            IN OUT NOCOPY  connection,
   secure_host  IN     VARCHAR2 DEFAULT NULL) 
RETURN reply;

UTL_SMTP.STARTTLS (
   c            IN OUT NOCOPY connection,
   secure_host  IN     VARCHAR2 DEFAULT NULL);

パラメータ

表273-39 STARTTLSファンクションおよびプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

secure_host

SMTPサーバーの証明書の共通名(CN)と照合するホスト名。これは、"*.example.com"のようなドメイン名でもある場合があります。

NULLの場合、接続先SMTPホスト名が使用されます。

戻り値

表273-40 STARTTLSファンクションおよびプロシージャの戻り値

戻り値 説明

reply

SMTP応答。

使用上のノート

STARTTLSコマンドは、暗号化されていない接続で、SMTPサーバーがEHLOコマンドの応答に対してこのコマンドがサポートされることを示した場合にのみ発行する必要があります。暗号化に使用するWalletは、OPEN_CONNECTIONファンクションによる初期SMTP接続のオープン時に指定されている必要があります。

DECLARE
  c utl_smtp.connection;
BEGIN
  c := utl_smtp.open_connection(
     host => 'smtp.example.com',
     port => 25,
     wallet_path => 'file:/oracle/wallets/smtp_wallet',
     wallet_password => 'password',
     secure_connection_before_smtp => FALSE);
  utl_smtp.starttls(c);
END

273.10.18 VRFYファンクション

このファンクションは、宛先の電子メール・アドレスの妥当性を検証します。

構文

UTL_SMTP.VRFY (
   c          IN OUT NOCOPY connection
   recipient  IN VARCHAR2) 
RETURN reply;

パラメータ

表273-41 VRFYファンクションのパラメータ

パラメータ 説明

c

SMTP接続。

recipient

検証される電子メール・アドレス。

戻り値

表273-42 VRFYファンクションの戻り値

戻り値 説明

reply

コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。

使用上のノート

サーバーは、宛先アドレスrecipientの解決を試みます。解決した場合、サーバーは受信者のフルネームと完全修飾メールボックス・パスを戻します。この要求の実行前には、OPEN_CONNECTION、およびHELOまたはEHLOを介して、サーバーへの接続が確立されている必要があります。

検証が正常に終了した場合は、ステータス・コード250または251で開始する1行以上の行が戻されます。

273.10.19 WRITE_DATAプロシージャ

このプロシージャは、電子メール・メッセージの一部を書き込みます。WRITE_DATAを繰り返しコールして、電子メール・メッセージにデータを追加します。

構文

UTL_SMTP.WRITE_DATA (
   c     IN OUT NOCOPY connection, 
   data  IN VARCHAR2 CHARACTER SET ANY_CS);

パラメータ

表273-43 WRITE_DATAプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

data

送信するメッセージのヘッダーを含めたテキストの一部([RFC822]形式)。

使用上のノート

273.10.20 WRITE_RAW_DATAプロシージャ

このプロシージャは、電子メール・メッセージの一部を書き込みます。WRITE_RAW_DATAを繰り返しコールして、電子メール・メッセージにデータを追加します。

構文

UTL_SMTP.WRITE_RAW_DATA (
   c     IN OUT NOCOPY connection
   data  IN RAW);

パラメータ

表273-44 WRITE_RAW_DATAプロシージャのパラメータ

パラメータ 説明

c

SMTP接続。

data

送信するメッセージのヘッダーを含めたテキストの一部([RFC822]形式)。

使用上のノート