UTL_SMTP
パッケージは、RFC821で定められたSimple Mail Transfer Protocol(SMTP)による電子メール送信ができるように設計されています。
関連項目: SMTPパッケージを使用して電子メールを送信する方法については、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。 |
この章では、次の項目について説明します。
概要
セキュリティ・モデル
タイプ
応答コード
例外
ルールおよび制限
例
プロトコルは、電子メール・クライアントから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
では、RFC821に指定されているSMTP通信が提供されますが、メッセージの内容をRFC822に従って書式設定するためのAPI(電子メールの件名の設定など)は提供していません。メッセージの適切な書式設定は、ユーザー各自で行ってください。 また、UTL_SMTP
は、SMTPを使用して電子メールを送信するように、SMTPサーバーをメール・クライアントに実装する機能は備えていません。
このパッケージは実行者権限のパッケージになったため、起動するユーザーには、接続するリモート・ネットワーク・ホストに割り当てられたアクセス制御リストで接続権限が付与されている必要があります。
注意: 詳細は、『Oracle Databaseセキュリティ・ガイド』の外部ネットワーク・サービスへのファイングレイン・アクセスの管理に関する項を参照してください。 |
SMTP接続を示すPL/SQLレコード・タイプです。
構文
TYPE connection IS RECORD ( host VARCHAR2(255), -- remote host name port PLS_INTEGER, -- remote port number tx_timeout PLS_INTEGER, -- Transfer time out (in seconds) private_tcp_con utl_tcp.connection, -- private, for implementation use private_state PLS_INTEGER -- private, for implementation use );
フィールド
表216-1 connectionレコード・タイプのフィールド
フィールド | 説明 |
---|---|
|
接続が確立したときのリモート・ホストの名前。接続が確立されない場合は |
|
接続したリモートSMTPサーバーのポート番号。接続が確立されない場合は |
|
この接続で読込みまたは書込み操作を中止するまでの |
|
実装目的でのみ使用されるプライベートのパラメータ。このフィールドは変更しないでください。 |
|
実装目的でのみ使用されるプライベートのパラメータ。このフィールドは変更しないでください。 |
使用上の注意
接続レコードの読取り専用フィールドは、open_connection
を使用して接続に成功した後、SMTP接続の情報を戻すために使用されます。これらのフィールドを変更しても、接続には影響ありません。 private_xxx
フィールドは、実装目的にのみ使用されます。これらのフィールドは変更しないでください。
SMTP応答行を示すPL/SQLレコード・タイプです。各SMTP応答行は、応答コードとそれに続くテキスト・メッセージで構成されています。大半のSMTPコマンドに対しては単一の応答行ですが、一部のSMTPコマンドに対しては複数の応答行となります。このような場合は、複数の応答行を示すために応答レコードのPL/SQL表が使用されます。
構文
TYPE reply IS RECORD ( code PLS_INTEGER, -- 3-digit reply code text VARCHAR2(508) -- text message ); TYPE replies IS TABLE OF reply INDEX BY BINARY_INTEGER; -- multiple reply lines
フィールド
次のリストにSMTP応答コードを示します。
表216-3 SMTP応答コード
応答コード | 意味 |
---|---|
|
システム・ステータスまたはシステム・ヘルプの応答です。 |
|
ヘルプ・メッセージ(使用方法や特定の非標準コマンドの意味に関する情報で、この応答は人間であるユーザーにのみ有用です)。 |
|
<domain>サービスは準備完了です。 |
|
<domain>サービスは送信チャネルをクローズしています。 |
|
要求したメール・アクションは正常で、完了しました。 |
|
ユーザーがローカルではありません。<forward-path>にフォワードします。 |
|
OK。ノード |
|
OK。ノード |
|
メール入力を開始し、 |
|
オクテット・オフセットは、トランザクション・オフセットです。 |
|
<domain>サービスが使用不可のため、送信チャネルをクローズしています(サービスのシャットダウンが必要な場合には、すべてのコマンドに対してこの応答が使用される可能性があります)。 |
|
要求したメール・アクションが実行されていません。メールボックスは使用不可です(メールボックス・ビジーなど)。 |
|
要求したアクションが終了しました。処理中にローカル・エラーが発生しました。 |
|
要求したアクションが実行されていません。システム記憶域不足です。 |
|
電子メールがありません。 |
|
一時的にTLSを使用できません。要求した認証メカニズムには暗号化が必要です。 |
|
ノード |
|
ノード |
|
構文エラーのため、コマンドを認識できません(コマンドラインが長すぎるなどのエラーも含まれます)。 |
|
パラメータまたは引数に構文エラーがあります。 |
|
コマンドが実装されていません。 |
|
コマンドの順序が不正です。 |
|
コマンド・パラメータが実装されていません。 |
|
|
|
|
|
認証メカニズムが脆弱です。 |
|
要求した認証メカニズムには暗号化が必要です。 |
|
要求したアクションが実行されていません。メールボックスは使用不可です(メールボックスが見つからない、アクセスできないなど)。 |
|
ユーザーがローカルではありません。<forward-path>を試行してください。 |
|
要求したメール・アクションが終了しました。記憶域の割当て超過です。 |
|
要求したアクションが実行されていません。メールボックス名が使用不可です(メールボックスの構文が正しくないなど)。 |
|
トランザクションに失敗しました。 |
次の表に、UTL_SMTP
パッケージのインタフェースが呼び出す可能性のある例外を示します。ネットワーク・エラーは、応答コード421(サービスは使用不可)になります。
表216-4 UTL_SMTPの例外
|
無効な操作が行われたときに呼び出されます。 つまり、 |
|
400番台の応答コードを受け取った場合に呼び出されます。 |
|
500番台の応答コードを受け取った場合に呼び出されます。 |
APIによる制限または範囲チェックはありません。ただし、SMTPの各種要素については、次のサイズ制限に注意する必要があります。制限を超えるデータが送信されると、サーバーからエラーが戻ります。
表216-5 SMTPのサイズ制限
要素 | サイズ制限 |
---|---|
|
ユーザー名の最大合計長は、64文字です。 |
|
ドメイン名またはドメイン番号の最大合計長は、64文字です。 |
|
reverse-pathまたはforward-pathの最大合計長は256文字です(句読点と要素のセパレータも含む)。 |
|
コマンド自体と |
|
応答コードと |
|
|
|
バッファリングを要する受信者の最大合計数は、100です。 |
次の例では、アプリケーションで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 will raise an -- exception that we can ignore. END; raise_application_error(-20000, 'Failed to send mail due to the following error: ' || sqlerrm); END;
表216-6 UTL_SMTPパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
|
データ・セッションをクローズします。 |
|
一般的なSMTPコマンドを実行します。 |
|
接続後にSMTPサーバーとの初期ハンドシェイクを実行します。 |
|
接続後、戻された詳細な情報を使用してSMTPサーバーとの初期ハンドシェイクを実行します。 |
|
接続後、戻された詳細な情報を使用してSMTPサーバーとの初期ハンドシェイクを実行します。 |
|
接続後にSMTPサーバーとの初期ハンドシェイクを実行します。 |
|
|
|
サーバーとのメール・トランザクションを開始します。宛先はメールボックスです。 |
|
NULLのコマンドです。 |
|
SMTPサーバーへの接続をオープンします。 |
|
|
|
SMTPセッションを終了し、サーバーとの接続を切断します。 |
|
電子メール・メッセージの受信者を指定します。 |
|
現行のメール・トランザクションを終了します。 |
|
宛先の電子メール・アドレスの妥当性を検証します。 |
|
電子メール・メッセージの一部を書き込みます。 |
|
|
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);
パラメータ
戻り値
表216-8 CLOSE_DATAファンクションおよびプロシージャの戻り値
戻り値 | 説明 |
---|---|
|
コマンドの応答(「reply、repliesレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 |
使用上の注意
OPEN_DATA
、WRITE_DATA
、WRITE_RAW_DATA
およびCLOSE_DATA
へのコールは、正しい順序で実行する必要があります。最初に、SMTPサーバーにDATA
コマンドを送信するために、OPEN_DATA
をコールすると、次に、実際のデータを送信するために、WRITE_DATA
またはWRITE_RAW_DATA
を繰り返しコールできます。データは、CLOSE_DATA
をコールして終了します。OPEN_DATA
がコールされた後にコールできるサブプログラムは、WRITE_DATA
、WRITE_RAW_DATA,
またはCLOSE_DATA
のみです。他のAPIへのコールは、INVALID_OPERATION
例外の発生原因となります。
CLOSE_DATA
は、必ずOPEN_CONNECTION
、HELO
またはEHLO
、MAIL
およびRCPT
がコールされた後にコールしてください。このルーチンがコールされるときは、SMTPサーバーへの接続がオープン状態で、メール・トランザクションがアクティブ状態である必要があります。
SMTPサーバーからの応答は、CLOSE_DATA
へのコール中にデータの終了が送信されるまで行われないため、WRITE_DATA
のファンクション形式は存在しないことに注意してください。
このファンクションおよびプロシージャは、一般的な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);
パラメータ
表216-9 COMMANDファンクションおよびプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
SMTP接続。 |
|
サーバーに送信するSMTPコマンド。 |
|
SMTP引数へのオプション引数。 |
戻り値
表216-10 COMMANDファンクションおよびプロシージャの戻り値
戻り値 | 説明 |
---|---|
|
コマンドの応答(「reply、repliesレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 |
使用上の注意
このファンクションは、一般的なSMTPコマンドを起動するために使用されます。COMMAND
は、単一の応答行が予想される場合にのみ使用します。複数の応答行が予想される場合は、COMMAND_REPLIES
を使用します。
COMMAND
は、SMTPサーバーからの応答が複数行ある場合、最終応答行のみを戻します。
このファンクションは、一般的なSMTPコマンドを実行します。
構文
UTL_SMTP.COMMAND_REPLIES ( c IN OUT NOCOPY connection, cmd IN VARCHAR2, arg IN VARCHAR2 DEFAULT NULL) RETURN replies;
パラメータ
表216-11 COMMAND_REPLIESファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
SMTP接続。 |
|
サーバーに送信するSMTPコマンド。 |
|
SMTP引数へのオプション引数。 |
戻り値
使用上の注意
このファンクションは、一般的なSMTPコマンドを起動するために使用されます。COMMAND
は、単一の応答行が予想される場合にのみ使用します。複数の応答行が予想される場合は、COMMAND_REPLIES
を使用します。
COMMAND
は、SMTPサーバーからの応答が複数行ある場合、最終応答行のみを戻します。
このファンクションおよびプロシージャは、電子メール・メッセージの本文を指定します。
構文
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);
パラメータ
戻り値
表216-14 DATAファンクションおよびプロシージャの戻り値
戻り値 | 説明 |
---|---|
|
コマンドの応答(「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という応答は、コール元に戻されません。
このファンクションおよびプロシージャは、接続後、戻された詳細な情報を使用してSMTPサーバーとの初期ハンドシェイクを実行します。
構文
UTL_SMTP.EHLO ( c IN OUT NOCOPY connection, domain IN) RETURN replies; UTL_SMTP.EHLO ( c IN OUT NOCOPY connection, domain IN);
パラメータ
戻り値
使用上の注意
EHLO
のインタフェースは、サーバーがその構成に関するより多くの詳細な情報を戻せることを除くとHELO
と同じです。 [RFC1869]には、戻される情報の書式が指定されています。書式は、PL/SQLアプリケーションでこのコールのファンクション形式を使用して取り出すことができます。HELO
との互換性のために、サーバーが戻すテキストの各行はステータス・コード250で開始されます。
関連ファンクション
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);
パラメータ
戻り値
表216-18 HELOファンクションおよびプロシージャの戻り値
戻り値 | 説明 |
---|---|
|
コマンドの応答(「reply、repliesレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 |
使用上の注意
RFC821では、接続した後でクライアントはサーバーに対してクライアント自体を識別する必要があると指定されています。このルーチンは、その識別を実行します。 このルーチンをコールする前に、OPEN_CONNECTIONファンクションをコールして接続をオープンにしておく必要があります。
サーバーからの応答は、ステータス・コード250で開始するメッセージになります。
関連ファンクション
EHLO
このファンクションは、HELP
コマンドを送信します。
構文
UTL_SMTP.HELP ( c IN OUT NOCOPY connection, command IN VARCHAR2 DEFAULT NULL) RETURN replies;
パラメータ
戻り値
このファンクションおよびプロシージャは、サーバーとのメール・トランザクションを開始します。宛先はメールボックスです。
構文
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);
パラメータ
表216-21 MAILファンクションおよびプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
SMTP接続。 |
|
メッセージを送信するユーザーの電子メール・アドレス。 |
|
[RFC1869]のセクション6に定義されているMAILコマンドへの追加パラメータ。XXX=XXX (XXX=XXX ....)の形式に従ってください。 |
戻り値
表216-22 MAILファンクションおよびプロシージャの戻り値
戻り値 | 説明 |
---|---|
|
コマンドの応答(「reply、repliesレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 |
使用上の注意
このコマンドはメッセージを送信しません。準備を開始するのみです。トランザクションを完了するには、このコマンドの後にRCPT
とDATA
へのコールが必要です。SMTPサーバーへの接続はオープン状態で、HELO
またはEHLO
コマンドはすでに送信されている必要があります。
サーバーからの応答は、ステータス・コード250で開始するメッセージになります。
NULLのコマンドです。
構文
UTL_SMTP.NOOP ( c IN OUT NOCOPY connection) RETURN reply; UTL_SMTP.NOOP ( c IN OUT NOCOPY connection);
パラメータ
戻り値
表216-24 NOOPファンクションおよびプロシージャの戻り値
戻り値 | 説明 |
---|---|
|
コマンドの応答(「reply、repliesレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 |
使用上の注意
このコマンドは、サーバーから正常な応答を引き出すことにのみ有効です。 OPEN_CONNECTION
でサーバーへの接続を確立した後は、いつでもこのコマンドを発行できます。NOOP
コマンドは、サーバーが接続され、正しくリスニングが行われていることを検証するために使用します。
このコマンドの応答は、常にステータス・コード250で開始する単一の行になります。
このファンクションは、SMTPサーバーへの接続をオープンします。
構文
UTL_SMTP.OPEN_CONNECTION ( host IN VARCHAR2, port IN PLS_INTEGER DEFAULT 25, c OUT connection, tx_timeout IN PLS_INTEGER DEFAULT NULL) RETURN reply; UTL_SMTP.OPEN_CONNECTION ( host IN VARCHAR2, port IN PLS_INTEGER DEFAULT 25, tx_timeout IN PLS_INTEGER DEFAULT NULL) RETURN connection;
パラメータ
表216-25 OPEN_CONNECTIONファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
SMTPサーバーのホストの名前。 |
|
SMTPサーバーがリスニングするポート番号(通常は25)。 |
|
SMTP接続。 |
|
この接続で読込みまたは書込み操作を中止するまでの |
戻り値
表216-26 OPEN_CONNECTIONファンクションの戻り値
戻り値 | 説明 |
---|---|
|
コマンドの応答(「reply、repliesレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 |
使用上の注意
サーバーからの応答は、ステータス・コード220で開始するメッセージになります。
UTL_SMTP
.CONNECTION
レコードを戻すOPEN_CONNECTION
のバージョンでは、接続が初めて確立した時点でSMTPサーバーから戻される応答コードをチェックします。応答がエラーを示した場合は、例外が発生します。そうでない場合は、応答を破棄します。 応答を調べるには、REPLY
を戻すOPEN_CONNECTION
を起動します。
tx_timeout
は、読込み操作および書込み操作の両方を制御するものです。ただし、現行のリリースでは実装が制限されているため、tx_timeout
による書込み操作の制御は行われません。
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);
パラメータ
表216-27 OPEN_DATAファンクションおよびプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
SMTP接続。 |
|
送信するメッセージのヘッダーを含めたテキストの一部([RFC822]形式)。 |
戻り値
表216-28 OPEN_DATAファンクションおよびプロシージャの戻り値
戻り値 | 説明 |
---|---|
|
コマンドの応答(「reply、repliesレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 |
使用上の注意
OPEN_DATA
、WRITE_DATA
、WRITE_RAW_DATA
およびCLOSE_DATA
へのコールは、正しい順序で実行する必要があります。最初に、SMTPサーバーにDATA
コマンドを送信するために、OPEN_DATA
をコールすると、次に、実際のデータを送信するために、WRITE_DATA
またはWRITE_RAW_DATA
を繰り返しコールできます。データは、CLOSE_DATA
をコールして終了します。OPEN_DATA
がコールされた後にコールできるサブプログラムは、WRITE_DATA
、WRITE_RAW_DATA,
またはCLOSE_DATA
のみです。他のAPIへのコールは、INVALID_OPERATION
例外の発生原因となります。
OPEN_DATA
は、必ずOPEN_CONNECTION
、HELO
またはEHLO
、MAIL
およびRCPT
がコールされた後にコールしてください。このルーチンがコールされるときは、SMTPサーバーへの接続がオープン状態で、メール・トランザクションがアクティブ状態である必要があります。
このファンクションは、SMTPセッションを終了し、サーバーとの接続を切断します。
構文
UTL_SMTP.QUIT ( c IN OUT NOCOPY connection) RETURN reply; UTL_SMTP.QUIT ( c IN OUT NOCOPY connection);
パラメータ
戻り値
表216-30 QUITファンクションおよびプロシージャの戻り値
戻り値 | 説明 |
---|---|
|
コマンドの応答(「reply、repliesレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 |
使用上の注意
QUIT
コマンドは、セッションを終了するというクライアントの意図をSMTPサーバーに伝えます。 伝えた後に、OPEN_CONNECTION
で確立した接続をクローズします。このOPEN_CONNECTIONは、このコマンドの実行前にコールされている必要があります。QUIT
の発行時にメール・トランザクションが進行中の場合は、RSET
と同様に放棄されます。
このコマンドのファンクション形式は、正常終了時にステータス・コード221で開始する単一の行を戻します。SMTPサーバーへの接続は、どのような場合にもクローズされます。 c
のREMOTE_HOST
およびREMOTE_PORT
フィールドはリセットされます。
関連ファンクション
RSET
このファンクションおよびプロシージャは、電子メール・メッセージの受信者を指定します。
構文
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);
表216-31 RCPTファンクションおよびプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
SMTP接続。 |
|
メッセージの送信先ユーザーの電子メール・アドレス。 |
|
[RFC1869]のセクション6に定義されているRCPTコマンドへの追加パラメータ。XXX=XXX (XXX=XXX ....)の形式に従ってください。 |
戻り値
表216-32 RCPTファンクションおよびプロシージャの戻り値
戻り値 | 説明 |
---|---|
|
コマンドの応答(「reply、repliesレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 |
使用上の注意
複数の受信者にメッセージを送信するには、このルーチンを複数回コールします。各起動で1つの電子メール・アドレスへの配信がスケジュールされます。 メッセージ・トランザクションは、先行するMAIL
へのコールによって開始されており、メール・サーバーへの接続はすでにオープン状態にあり、先行するOPEN_CONNECTION
およびHELO
またはEHLO
へのコールによってそれぞれ初期化されている必要があります。
サーバーからの応答は、ステータス・コード250または251で開始するメッセージになります。
このファンクションは、現行のメール・トランザクションを終了します。
構文
UTL_SMTP.RSET ( c IN OUT NOCOPY connection) RETURN reply; UTL_SMTP.RSET ( c IN OUT NOCOPY connection);
パラメータ
戻り値
表216-34 RSETファンクションおよびプロシージャの戻り値
戻り値 | 説明 |
---|---|
|
コマンドの応答(「reply、repliesレコード・タイプ」を参照)。複数の応答が存在する場合は、最後の応答が戻されます。 |
使用上の注意
このコマンドによって、クライアントは構成処理中のメール・メッセージを放棄できます。メールは送信されません。 クライアントは、SMTPサーバーへの接続がOPEN_CONNECTION
でオープンされた後は、DATA
またはOPEN_DATA
がコールされるまで、いつでもRSET
をコールできます。ただし、電子メール・データの送信が始まってしまった後では、その送信を中止できません。
サーバーは、RSET
に対してステータス・コード250で開始するメッセージで常に応答します。
関連ファンクション
QUIT
このファンクションは、宛先の電子メール・アドレスの妥当性を検証します。
構文
UTL_SMTP.VRFY ( c IN OUT NOCOPY connection recipient IN VARCHAR2) RETURN reply;
パラメータ
戻り値
使用上の注意
サーバーは、宛先アドレスrecipient
の解決を試みます。解決した場合、サーバーは受信者のフルネームと完全修飾メールボックス・パスを戻します。 この要求の実行前には、OPEN_CONNECTION
、およびHELO
またはEHLO
を介して、サーバーへの接続が確立されている必要があります。
検証が正常に終了した場合は、ステータス・コード250または251で開始する1行以上の行が戻されます。
WRITE_DATA
を使用して、電子メール・メッセージの一部を書き込みます。 WRITE_DATA
を繰り返しコールして、電子メール・メッセージにデータを追加します。
構文
UTL_SMTP.WRITE_DATA ( c IN OUT NOCOPY connection, data IN VARCHAR2 CHARACTER SET ANY_CS);
パラメータ
使用上の注意
OPEN_DATA
、WRITE_DATA
、WRITE_RAW_DATA
およびCLOSE_DATA
へのコールは、正しい順序で実行する必要があります。最初に、SMTPサーバーにDATA
コマンドを送信するために、OPEN_DATA
をコールすると、次に、実際のデータを送信するために、WRITE_DATA
またはWRITE_RAW_DATA
を繰り返しコールできます。データは、CLOSE_DATA
をコールして終了します。OPEN_DATA
がコールされた後にコールできるサブプログラムは、WRITE_DATA
、WRITE_RAW_DATA,
またはCLOSE_DATA
のみです。他のAPIへのコールは、INVALID_OPERATION
例外の発生原因となります。
bodyパラメータの内容がMIME(RFC822)の仕様に準拠していることをアプリケーションにより確認する必要があります。DATA
ルーチンは、RFC821の要求に従って、<CR><LF>.<CR><LF>
の順序で(行の開始はシングル・ピリオド)メッセージを終了します。また、bodyの<CR><LF>.<CR><LF>
(シングル・ピリオド)の順序を<CR><LF>..<CR><LF>
(ダブル・ピリオド)に変換します。この変換によって、RFC821のセクション4.5.2に記述されている透過性が提供されます。
この変換は完全でないことに注意してください。このコード・フラグメントを次に示します。
UTL_SMTP.WRITE_DATA('some message.' || chr(13) || chr(10)); UTL_SMTP.WRITE_DATA('.' || chr(13) || chr(10));
順序<CR><LF>.<CR><LF>
は、WRITE_DATA
への2回のコールに分割されるため、WRITE_DATA
の実装によって、データの終了順序は検出されません。したがって、変換も実行されません。このような状態は、ユーザーの責任で処理する必要があります。処理が行われない場合、メッセージ・データの終端が不完全となる可能性があります。
WRITE_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
データを送信できます。
WRITE_RAW_DATA
を使用して、電子メール・メッセージの一部を書き込みます。 WRITE_RAW_DATA
を繰り返しコールして、電子メール・メッセージにデータを追加します。
構文
UTL_SMTP.WRITE_RAW_DATA ( c IN OUT NOCOPY connection data IN RAW);
パラメータ
使用上の注意
OPEN_DATA
、WRITE_DATA
、WRITE_RAW_DATA
およびCLOSE_DATA
へのコールは、正しい順序で実行する必要があります。最初に、SMTPサーバーにDATA
コマンドを送信するために、OPEN_DATA
をコールすると、次に、実際のデータを送信するために、WRITE_DATA
またはWRITE_RAW_DATA
を繰り返しコールできます。データは、CLOSE_DATA
をコールして終了します。OPEN_DATA
がコールされた後にコールできるサブプログラムは、WRITE_DATA
、WRITE_RAW_DATA,
またはCLOSE_DATA
のみです。他のAPIへのコールは、INVALID_OPERATION
例外の発生原因となります。
bodyパラメータの内容がMIME(RFC822)の仕様に準拠していることをアプリケーションにより確認する必要があります。DATA
ルーチンは、RFC821の要求に従って、<CR><LF>.<CR><LF>
の順序で(行の開始はシングル・ピリオド)メッセージを終了します。また、bodyの<CR><LF>.<CR><LF>
(シングル・ピリオド)の順序を<CR><LF>..<CR><LF>
(ダブル・ピリオド)に変換します。この変換によって、RFC821のセクション4.5.2に記述されている透過性が提供されます。
この変換は完全でないことに注意してください。このコード・フラグメントを次に示します。
UTL_SMTP.WRITE_DATA('some message.' || chr(13) || chr(10)); UTL_SMTP.WRITE_DATA('.' || chr(13) || chr(10));
順序<CR><LF>.<CR><LF>
は、WRITE_DATA
への2回のコールに分割されるため、WRITE_DATA
の実装によって、データの終了順序は検出されません。したがって、変換も実行されません。このような状態は、ユーザーの責任で処理する必要があります。処理が行われない場合、メッセージ・データの終端が不完全となる可能性があります。
XXX_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
データを送信できます。