276 UTL_SMTP
UTL_SMTPパッケージは、RFC821で定められたSimple Mail Transfer Protocol(SMTP)による電子メール送信ができるように設計されています。 
               
この章のトピックは、次のとおりです:
276.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サーバーをメール・クライアントに実装する機能は備えていません。
                     
276.2 UTL_SMTPのセキュリティ・モデル
このパッケージは実行者権限のパッケージです。起動するユーザーには、接続する必要のあるリモート・ネットワーク・ホストに割り当てられたアクセス制御リストでconnect権限が付与されている必要があります。 
                  
ノート:
ファイングレイン・アクセスの管理の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。
276.3 UTL_SMTPの定数
UTL_SMTPは、パラメータ値の指定時に使用するいくつかの定数を定義します。 
                  
これらを、次の表に示します。
表276-1 UTL_SMTPの定数
| 名前 | タイプ | 値 | 説明 | 
|---|---|---|---|
| 
 | 
 | 
 | 
 | 
| 
 | 
 | 
 | 
 | 
276.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);フィールド
表276-2 CONNECTIONレコード・タイプのフィールド
| フィールド | 説明 | 
|---|---|
| 
 | 接続が確立したときのリモート・ホストの名前。接続が確立されない場合は | 
| 
 | 接続したリモートSMTPサーバーのポート番号。接続が確立されない場合は | 
| 
 | この接続で読取りまたは書込み操作を中止するまでの | 
| 
 | 実装目的でのみ使用されるプライベートのパラメータ。このフィールドは変更しないでください。 | 
| 
 | 実装目的でのみ使用されるプライベートのパラメータ。このフィールドは変更しないでください。 | 
使用上のノート
接続レコードの読取り専用フィールドは、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;
フィールド
表276-3 reply、repliesレコード・タイプのフィールド
| フィールド | 説明 | 
|---|---|
| 
 | 3桁の応答コード。 | 
| 
 | 応答のテキスト・メッセージ。 | 
276.5 UTL_SMTPの応答コード
SMTPサーバーは、メッセージまたはサーバー・ステータスを示す応答コードを送信します。
次のリストにSMTP応答コードを示します。
表276-4 SMTP応答コード
| 応答コード | 意味 | 
|---|---|
| 
 | システム・ステータスまたはシステム・ヘルプの応答です。 | 
| 
 | ヘルプ・メッセージ(使用方法や特定の非標準コマンドの意味に関する情報で、この応答は人間であるユーザーにのみ有用です)。 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 要求したメール・アクションは正常で、完了しました。 | 
| 
 | ユーザーがローカルではありません。 | 
| 
 | OK。ノード | 
| 
 | OK。ノード | 
| 
 | メール入力を開始し、 | 
| 
 | オクテット・オフセットは、トランザクション・オフセットです。 | 
| 
 | 
 | 
| 
 | 要求したメール・アクションが実行されていません。メールボックスは使用不可です(メールボックス・ビジーなど)。 | 
| 
 | 要求したアクションが終了しました。処理中にローカル・エラーが発生しました。 | 
| 
 | 要求したアクションが実行されていません。システム記憶域不足です。 | 
| 
 | 電子メールがありません。 | 
| 
 | 一時的にTLSを使用できません。要求した認証メカニズムには暗号化が必要です。 | 
| 
 | ノード | 
| 
 | ノード | 
| 
 | 構文エラーのため、コマンドを認識できません(コマンドラインが長すぎるなどのエラーも含まれます)。 | 
| 
 | パラメータまたは引数に構文エラーがあります。 | 
| 
 | コマンドが実装されていません。 | 
| 
 | コマンドの順序が不正です。 | 
| 
 | コマンド・パラメータが実装されていません。 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 認証メカニズムが脆弱です。 | 
| 
 | 要求した認証メカニズムには暗号化が必要です。 | 
| 
 | 要求したアクションが実行されていません。メールボックスは使用不可です(メールボックスが見つからない、アクセスできないなど)。 | 
| 
 | ユーザーがローカルではありません。 | 
| 
 | 要求したメール・アクションが終了しました。記憶域の割当て超過です。 | 
| 
 | 要求したアクションが実行されていません。メールボックス名が使用不可です(メールボックスの構文が正しくないなど)。 | 
| 
 | トランザクションに失敗しました。 | 
276.6 UTL_SMTPの操作上のノート
SMTP接続は、SMTP接続を戻すOPEN_CONNECTIONファンクションのコールによって開始されます。  
                  
接続の確立後、メールを送信するには、次のコールが必要です。
HELOファンクションおよびプロシージャ: 送信元のドメインを識別します。
MAILファンクションおよびプロシージャ: メールを開始し、送信元を指定します。
RCPTファンクション: 受信者を指定します。
OPEN_DATAファンクションおよびプロシージャ: メールの本文を開始します。
WRITE_RAW_DATAプロシージャ: メールの本文を書き込みます(複数のコール可)。
CLOSE_DATAファンクションおよびプロシージャ: メールの本文を閉じて、メールを送信します。
SMTP接続を終了するには、QUITファンクションおよびプロシージャをコールします。
                  
276.7 UTL_SMTPの例外
次の表に、UTL_SMTPパッケージのインタフェースが呼び出す可能性のある例外を示します。 
                  
ネットワーク・エラーは、応答コード421(サービスは使用不可)になります。
表276-5 UTL_SMTPの例外
| 例外 | 説明 | 
|---|---|
| 
 | 無効な操作が行われたときに呼び出されます。つまり、OPEN_DATAファンクションおよびプロシージャをコールした後に、WRITE_DATAプロシージャ、WRITE_RAW_DATAプロシージャまたはCLOSE_DATAファンクションおよびプロシージャ以外のAPIをコールすることや、最初に | 
| 
 | 400番台の応答コードを受け取った場合に呼び出されます。 | 
| 
 | 500番台の応答コードを受け取った場合に呼び出されます。 | 
276.8 UTL_SMTPのルールおよび制限
このAPIによって課される制限または範囲チェックはありません。ただし、SMTPの各種要素については、制限に注意する必要があります。制限を超えるデータが送信されると、サーバーからエラーが戻ります。
次の表は、UTL_SMTPサブプログラムでのサイズ制限について説明しています。
表276-6 SMTPのサイズ制限
| 要素 | サイズ制限 | 
|---|---|
| 
 | ユーザー名の最大合計長は、64文字です。 | 
| 
 | ドメイン名またはドメイン番号の最大合計長は、64文字です。 | 
| 
 | reverse-pathまたはforward-pathの最大合計長は256文字です(句読点と要素のセパレータも含む)。 | 
| 
 | コマンド自体と | 
| 
 | 応答コードと | 
| 
 | 
 | 
| 
 | バッファリングを要する受信者の最大合計数は、100です。 | 
276.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;276.10 UTL_SMTPサブプログラムの要約
この表は、UTL_SMTPサブプログラムを示し、簡単に説明しています。
                  
表276-7 UTL_SMTPパッケージのサブプログラム
| サブプログラム | 説明 | 
|---|---|
| 
 | |
| SMTP接続をクローズして、現行のSMTP操作を終了します。 | |
| データ・セッションをクローズします。 | |
| 一般的なSMTPコマンドを実行します。 | |
| 一般的なSMTPコマンドを実行して、複数の応答行を取得します。 | |
| 電子メール本文を送信します。 | |
| 
 | |
| 
 | |
| 
 | |
| サーバーとの電子メール・トランザクションを開始します。宛先はメールボックスです。 | |
| 
 | |
| SMTPサーバーへの接続をオープンします。 | |
| 
 | |
| SMTPセッションを終了し、サーバーとの接続を切断します。 | |
| 電子メール・メッセージの受信者を指定します。 | |
| 現行の電子メール・トランザクションを終了します。 | |
| 
 | |
| 宛先の電子メール・アドレスの妥当性を検証します。 | |
| 電子メール・メッセージの一部を書き込みます。 | |
| 
 | 
276.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);
パラメータ
表276-8 AUTHファンクションおよびプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
| 
 | ユーザー名。 | 
| 
 | パスワード。 | 
| 
 | 
 | 
戻り値
表276-9 AUTHファンクションおよびプロシージャ・ファンクションの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 | 
使用上のノート
- 
                              現在、 UTL_SMTPでサポートされる認証方式は、PLAIN、LOGINおよびCRAM-MD5のみです。
- 
                              SMTPサーバーでは、 STARTTLSコマンドを実行してSSL/TLSによってSMTP接続を保護した後に、サポートされる認証方式が変更される可能性があるため(PLAINやLOGINの追加など)、コール元では、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;276.10.2 CLOSE_CONNECTIONプロシージャ
このプロシージャは、SMTP接続をクローズして、現行のSMTP操作を終了します。データ・セッション中に電子メールを取り消す場合にのみ、このプロシージャを使用してください。
SMTP接続を正常に終了させるには、QUITファンクションおよびプロシージャを使用します。
構文
UTL_SMTP.CLOSE_CONNECTION ( c IN OUT NOCOPY connection);
パラメータ
表276-10 CLOSE_CONNECTIONプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
276.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);
パラメータ
表276-11 CLOSE_DATAファンクションおよびプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
戻り値
表276-12 CLOSE_DATAファンクションおよびプロシージャの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 | 
使用上のノート
OPEN_DATA、WRITE_DATA、WRITE_RAW_DATAおよびCLOSE_DATAへのコールは、正しい順序で実行する必要があります。プログラムは、DATAコマンドをSMTPサーバーに送信するためにOPEN_DATAをコールします。次に、実際のデータを送信するために、WRITE_DATAまたはWRITE_RAW_DATAを繰り返しコールできます。データは、CLOSE_DATAをコールして終了します。OPEN_DATAがコールされた後にコールできるサブプログラムは、WRITE_DATA、WRITE_RAW_DATAまたはCLOSE_DATAのみです。他のサブプログラムのコールは、INVALID_OPERATION例外の発生原因となります。
                        
CLOSE_DATAは、OPEN_CONNECTION、HELOまたはEHLO、MAILおよびRCPTがコールされた後にコールする必要があります。このルーチンがコールされるときは、SMTPサーバーへの接続がオープン状態で、メール・トランザクションがアクティブ状態である必要があります。
                        
SMTPサーバーからの応答は、CLOSE_DATAへのコール中にデータの終了が送信されるまで行われないため、WRITE_DATAのファンクション形式は存在しないことに注意してください。
                        
276.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);
パラメータ
表276-13 COMMANDファンクションおよびプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
| 
 | サーバーに送信するSMTPコマンド。 | 
| 
 | SMTP引数へのオプション引数。 | 
戻り値
表276-14 COMMANDファンクションおよびプロシージャの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 | 
使用上のノート
このファンクションは、一般的なSMTPコマンドを起動するために使用されます。COMMANDは、単一の応答行が予想される場合にのみ使用します。複数の応答行が予想される場合は、COMMAND_REPLIESを使用します。
                        
COMMANDは、SMTPサーバーからの応答が複数行ある場合、最終応答行のみを戻します。 
                        
276.10.5 COMMAND_REPLIESファンクション
このファンクションは、一般的なSMTPコマンドを実行して、複数の応答行を取得します。
構文
UTL_SMTP.COMMAND_REPLIES ( c IN OUT NOCOPY connection, cmd IN VARCHAR2, arg IN VARCHAR2 DEFAULT NULL) RETURN replies;
パラメータ
表276-15 COMMAND_REPLIESファンクションのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
| 
 | サーバーに送信するSMTPコマンド。 | 
| 
 | SMTP引数へのオプション引数。 | 
戻り値
表276-16 COMMAND_REPLIESファンクションの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。 | 
使用上のノート
このファンクションは、一般的なSMTPコマンドを起動するために使用されます。COMMANDは、単一の応答行が予想される場合にのみ使用します。複数の応答行が予想される場合は、COMMAND_REPLIESを使用します。
                        
COMMANDは、SMTPサーバーからの応答が複数行ある場合、最終応答行のみを戻します。 
                        
276.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);
パラメータ
表276-17 DATAファンクションおよびプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
| 
 | 送信するメッセージのヘッダーを含めたテキスト([RFC822]形式)。 | 
戻り値
表276-18 DATAファンクションおよびプロシージャの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「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_CONNECTION、HELOまたはEHLO、MAILおよびRCPTがコールされた後にコールする必要があります。このルーチンがコールされるときは、SMTPサーバーへの接続がオープン状態で、メール・トランザクションがアクティブ状態である必要があります。
                        
サーバーからの応答は、ステータス・コード250で開始するメッセージになります。初期DATAコマンドから受信した354という応答は、コール元に戻されません。
                        
276.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);
パラメータ
表276-19 EHLOファンクションおよびプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
| 
 | ローカル(送信側)ホストのドメイン名。識別の目的で使用されます。 | 
戻り値
表276-20 EHLOファンクションおよびプロシージャの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。 | 
使用上のノート
EHLOのインタフェースは、サーバーがその構成に関するより多くの詳細な情報を戻せることを除くとHELOと同じです。[RFC1869]には、戻される情報の書式が指定されています。書式は、PL/SQLアプリケーションでこのコールのファンクション形式を使用して取り出すことができます。HELOとの互換性のために、サーバーが戻すテキストの各行はステータス・コード250で開始されます。
                        
関連ファンクション
276.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);
パラメータ
表276-21 HELOファンクションおよびプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
| 
 | ローカル(送信側)ホストのドメイン名。識別の目的で使用されます。 | 
戻り値
表276-22 HELOファンクションおよびプロシージャの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 | 
使用上のノート
RFC 821では、接続した後でクライアントはサーバーに対してクライアント自体を識別する必要があると指定されています。このルーチンは、その識別を実行します。このルーチンをコールする前に、OPEN_CONNECTIONファンクションをコールして接続をオープンにしておく必要があります。
サーバーからの応答は、ステータス・コード250で開始するメッセージになります。
関連ファンクション
276.10.9 HELPファンクション
このファンクションは、HELPコマンドを送信します。
                     
構文
UTL_SMTP.HELP ( c IN OUT NOCOPY connection, command IN VARCHAR2 DEFAULT NULL) RETURN replies;
パラメータ
表276-23 HELPファンクションのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
| 
 | ヘルプ・メッセージを取得するコマンド。 | 
戻り値
表276-24 HELPファンクションの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。 | 
276.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);
パラメータ
表276-25 MAILファンクションおよびプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
| 
 | メッセージを送信するユーザーの電子メール・アドレス。 | 
| 
 | [RFC1869]のセクション6に定義されている | 
戻り値
表276-26 MAILファンクションおよびプロシージャの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 | 
使用上のノート
このコマンドはメッセージを送信しません。準備を開始するのみです。トランザクションを完了するには、RCPTおよびDATAへのコールを後に続ける必要があります。SMTPサーバーへの接続はオープン状態で、HELOまたはEHLOコマンドはすでに送信されている必要があります。
                        
サーバーからの応答は、ステータス・コード250で開始するメッセージになります。
276.10.11 NOOPファンクションおよびプロシージャ
このサブプログラムは、NULLコマンドを発行します。
                     
構文
UTL_SMTP.NOOP ( c IN OUT NOCOPY connection) RETURN reply; UTL_SMTP.NOOP ( c IN OUT NOCOPY connection);
パラメータ
表276-27 NOOPファンクションおよびプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
戻り値
表276-28 NOOPファンクションおよびプロシージャの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 | 
使用上のノート
- 
                              このコマンドは、サーバーから正常な応答を引き出すことにのみ有効です。 OPEN_CONNECTIONでサーバーへの接続を確立した後は、いつでもこのコマンドを発行できます。NOOPコマンドは、サーバーが接続され、正しくリスニングが行われていることを検証するために使用します。
- 
                              このコマンドの応答は、ステータス・コード250で開始する単一の行になります。 
276.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;
パラメータ
表276-29 OPEN_CONNECTIONファンクションのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTPサーバーのホストの名前。 | 
| 
 | SMTPサーバーがリスニングするポート番号(通常は25)。 | 
| 
 | SMTP接続。 | 
| 
 | この接続で読取りまたは書込み操作を中止するまでの | 
| 
 | SSL/TLS用のOracle Walletを含むディレクトリ・パス。形式は | 
| 
 | Walletをオープンするためのパスワード。Walletの自動ログインが有効の場合は、パスワードを | 
| 
 | 
 | 
| 
 | セキュアな接続が使用されるときにSMTPサーバーの証明書の共通名(CN)と照合するホスト名。これは、 
 | 
戻り値
表276-30 OPEN_CONNECTIONファンクションの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「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;276.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);
パラメータ
表276-31 OPEN_DATAファンクションおよびプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
| 
 | 送信するメッセージのヘッダーを含めたテキストの一部(RFC822形式)。 | 
戻り値
表276-32 OPEN_DATAファンクションおよびプロシージャ・ファンクションの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 | 
使用上のノート
- 
                              OPEN_DATA、WRITE_DATA、WRITE_RAW_DATAおよびCLOSE_DATAへのコールは、正しい順序で実行する必要があります。プログラムは、DATAコマンドをSMTPサーバーに送信するためにOPEN_DATAをコールします。次に、実際のデータを送信するために、WRITE_DATAまたはWRITE_RAW_DATAを繰り返しコールできます。データは、CLOSE_DATAをコールして終了します。OPEN_DATAがコールされた後にコールできるサブプログラムは、WRITE_DATA、WRITE_RAW_DATAまたはCLOSE_DATAのみです。他のサブプログラムのコールは、INVALID_OPERATION例外の発生原因となります。
- 
                              OPEN_DATAは、OPEN_CONNECTION、HELOまたはEHLO、MAILおよびRCPTがコールされた後にコールする必要があります。このルーチンがコールされるときは、SMTPサーバーへの接続がオープン状態で、メール・トランザクションがアクティブ状態である必要があります。
276.10.14 QUITファンクションおよびプロシージャ
このサブプログラムは、SMTPセッションを終了し、サーバーとの接続を切断します。
構文
UTL_SMTP.QUIT ( c IN OUT NOCOPY connection) RETURN reply; UTL_SMTP.QUIT ( c IN OUT NOCOPY connection);
パラメータ
表276-33 QUITファンクションおよびプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
戻り値
表276-34 QUITファンクションおよびプロシージャ・ファンクションの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 | 
使用上のノート
QUITコマンドは、セッションを終了するというクライアントの意図をSMTPサーバーに伝えます。伝えた後に、OPEN_CONNECTIONで確立した接続をクローズします。このOPEN_CONNECTIONは、このコマンドの実行前にコールされている必要があります。QUITの発行時にメール・トランザクションが進行中の場合は、RSETと同様に放棄されます。 
                        
このコマンドのファンクション形式は、正常終了時にステータス・コード221で開始する単一の行を戻します。SMTPサーバーへの接続は、どのような場合にもクローズされます。cのREMOTE_HOSTおよびREMOTE_PORTフィールドはリセットされます。
                        
関連ファンクション
276.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);
表276-35 RCPTファンクションおよびプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
| 
 | メッセージの送信先ユーザーの電子メール・アドレス。 | 
| 
 | [RFC1869]のセクション6に定義されているRCPTコマンドへの追加パラメータ。XXX=XXX (XXX=XXX ....)の形式に従う必要があります。 | 
戻り値
表276-36 RCPTファンクションおよびプロシージャ・ファンクションの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 | 
使用上のノート
複数の受信者にメッセージを送信するには、このルーチンを複数回コールします。各起動で1つの電子メール・アドレスへの配信がスケジュールされます。メッセージ・トランザクションは、先行するMAILへのコールによって開始されており、メール・サーバーへの接続はすでにオープン状態にあり、先行するOPEN_CONNECTIONおよびHELOまたはEHLOへのコールによってそれぞれ初期化されている必要があります。
                        
サーバーからの応答は、ステータス・コード250または251で開始するメッセージになります。
276.10.16 RSETファンクションおよびプロシージャ
このサブプログラムは、現行のメール・トランザクションを終了します。
構文
UTL_SMTP.RSET ( c IN OUT NOCOPY connection) RETURN reply; UTL_SMTP.RSET ( c IN OUT NOCOPY connection);
パラメータ
表276-37 RSETファンクションおよびプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
戻り値
表276-38 RSETファンクションおよびプロシージャの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 | 
使用上のノート
- 
                              このコマンドによって、クライアントは構成処理中の電子メール・メッセージを取り消すことができます。メールは送信されません。クライアントは、SMTPサーバーへの接続が OPEN_CONNECTIONでオープンされた後は、DATAまたはOPEN_DATAがコールされるまで、いつでもRSETをコールできます。ただし、電子メール・データの送信が始まってしまった後では、その送信を中止できません。
- 
                              サーバーは、 RSETに対してステータス・コード250で開始するメッセージで応答します。
関連ファンクション
276.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);
パラメータ
表276-39 STARTTLSファンクションおよびプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
| 
 | SMTPサーバーの証明書の共通名(CN)と照合するホスト名。これは、 
 | 
戻り値
表276-40 STARTTLSファンクションおよびプロシージャの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | 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);
END276.10.18 VRFYファンクション
このファンクションは、宛先の電子メール・アドレスの妥当性を検証します。
構文
UTL_SMTP.VRFY ( c IN OUT NOCOPY connection recipient IN VARCHAR2) RETURN reply;
パラメータ
表276-41 VRFYファンクションのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
| 
 | 検証される電子メール・アドレス。 | 
戻り値
表276-42 VRFYファンクションの戻り値
| 戻り値 | 説明 | 
|---|---|
| 
 | コマンドの応答(「UTl_SMTPのタイプ」の「REPLY_REPLIESレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 | 
使用上のノート
サーバーは、宛先アドレスrecipientの解決を試みます。解決した場合、サーバーは受信者のフルネームと完全修飾メールボックス・パスを戻します。この要求の実行前には、OPEN_CONNECTION、およびHELOまたはEHLOを介して、サーバーへの接続が確立されている必要があります。
                        
検証が正常に終了した場合は、ステータス・コード250または251で開始する1行以上の行が戻されます。
276.10.19 WRITE_DATAプロシージャ
このプロシージャは、電子メール・メッセージの一部を書き込みます。WRITE_DATAを繰り返しコールして、電子メール・メッセージにデータを追加します。
                     
構文
UTL_SMTP.WRITE_DATA ( c IN OUT NOCOPY connection, data IN VARCHAR2 CHARACTER SET ANY_CS);
パラメータ
表276-43 WRITE_DATAプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
| 
 | 送信するメッセージのヘッダーを含めたテキストの一部([RFC822]形式)。 | 
使用上のノート
- 
                              OPEN_DATAファンクションおよびプロシージャ、WRITE_DATAプロシージャ、WRITE_RAW_DATAプロシージャおよびCLOSE_DATAファンクションおよびプロシージャへのコールは、正しい順序で実行する必要があります。プログラムは、 DATAコマンドをSMTPサーバーに送信するためにOPEN_DATAをコールします。次に、実際のデータを送信するために、WRITE_DATAまたはWRITE_RAW_DATAを繰り返しコールできます。データは、CLOSE_DATAをコールして終了します。OPEN_DATAがコールされた後にコールできるサブプログラムは、WRITE_DATA、WRITE_RAW_DATAまたはCLOSE_DATAのみです。他のサブプログラムのコールは、INVALID_OPERATION例外の発生原因となります。
- 
                              bodyパラメータの内容がMIME(RFC822)の仕様に準拠していることをアプリケーションは確認する必要があります。 DATAルーチンは、RFC821の要求に従って、<CR><LF>.<CR><LF>の順序で(行の開始はシングル・ピリオド)メッセージを終了します。また、bodyの<CR><LF>.<CR><LF>(シングル・ピリオド)の順序を<CR><LF>..<CR><LF>(ダブル・ピリオド)に変換します。この変換によって、RFC821のセクション4.5.2に記述されている透過性が提供されます。
- 
                              OPEN_DATAファンクションおよびプロシージャ、WRITE_DATAプロシージャ、WRITE_RAW_DATAプロシージャ、およびCLOSE_DATAファンクションおよびプロシージャは、OPEN_CONNECTIONファンクション、HELOファンクションおよびプロシージャまたはEHLOファンクションおよびプロシージャ、MAILファンクションおよびプロシージャ、およびRCPTファンクションがコールされた後にコールする必要があります。このルーチンがコールされるときは、SMTPサーバーへの接続がオープン状態で、メール・トランザクションがアクティブ状態である必要があります。 
- 
                              SMTPサーバーからの応答は、CLOSE_DATAファンクションおよびプロシージャへのコール中にデータの終了が送信されるまで行われないため、WRITE_DATAプロシージャのファンクション形式は存在しないことに注意してください。 
- 
                              WRITE_DATAを使用して送信するテキスト(VARCHAR2)データは、送信前にUS7ASCIIに変換されます。テキストにマルチバイト・キャラクタが含まれている場合は、テキスト内のUS7ASCIIに変換できない各マルチバイト・キャラクタが'?'文字に置き換えられます。EHLOサブプログラムを使用してSMTPサーバーとの間で8BITMIME拡張要素を処理する場合は、最初にUTL_RAWパッケージでテキストをRAWに変換してから、WRITE_RAW_DATAを使用してRAWデータを送信することによって、マルチバイトのVARCHAR2データを送信できます。
276.10.20 WRITE_RAW_DATAプロシージャ
このプロシージャは、電子メール・メッセージの一部を書き込みます。WRITE_RAW_DATAを繰り返しコールして、電子メール・メッセージにデータを追加します。 
                     
構文
UTL_SMTP.WRITE_RAW_DATA ( c IN OUT NOCOPY connection data IN RAW);
パラメータ
表276-44 WRITE_RAW_DATAプロシージャのパラメータ
| パラメータ | 説明 | 
|---|---|
| 
 | SMTP接続。 | 
| 
 | 送信するメッセージのヘッダーを含めたテキストの一部([RFC822]形式)。 | 
使用上のノート
- 
                              OPEN_DATAファンクションおよびプロシージャ、WRITE_DATAプロシージャ、WRITE_RAW_DATAプロシージャおよびCLOSE_DATAファンクションおよびプロシージャへのコールは、正しい順序で実行する必要があります。プログラムは、 DATAコマンドをSMTPサーバーに送信するためにOPEN_DATAをコールします。次に、実際のデータを送信するために、WRITE_DATAまたはWRITE_RAW_DATAを繰り返しコールできます。データは、CLOSE_DATAをコールして終了します。OPEN_DATAがコールされた後にコールできるサブプログラムは、WRITE_DATA、WRITE_RAW_DATAまたはCLOSE_DATAのみです。他のサブプログラムのコールは、INVALID_OPERATION例外の発生原因となります。
- 
                              bodyパラメータの内容がMIME(RFC822)の仕様に準拠していることをアプリケーションは確認する必要があります。 DATAルーチンは、RFC821の要求に従って、<CR><LF>.<CR><LF>の順序で(行の開始はシングル・ピリオド)メッセージを終了します。また、bodyの<CR><LF>.<CR><LF>(シングル・ピリオド)の順序を<CR><LF>..<CR><LF>(ダブル・ピリオド)に変換します。この変換によって、RFC821のセクション4.5.2に記述されている透過性が提供されます。
- 
                              OPEN_DATAファンクションおよびプロシージャ、WRITE_DATAプロシージャ、WRITE_RAW_DATAプロシージャ、およびCLOSE_DATAファンクションおよびプロシージャは、OPEN_CONNECTIONファンクション、HELOファンクションおよびプロシージャまたはEHLOファンクションおよびプロシージャ、MAILファンクションおよびプロシージャ、およびRCPTファンクションがコールされた後にコールする必要があります。このルーチンがコールされるときは、SMTPサーバーへの接続がオープン状態で、メール・トランザクションがアクティブ状態である必要があります。 
- 
                              SMTPサーバーからの応答は、CLOSE_DATAファンクションおよびプロシージャへのコール中にデータの終了が送信されるまで行われないため、WRITE_DATAプロシージャのファンクション形式は存在しないことに注意してください。