ヘッダーをスキップ
Oracle® Application Express APIリファレンス
リリース4.2 for Oracle Database 12c
B71340-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

16 APEX_MAIL

APEX_MAILパッケージを使用してOracle Application Expressアプリケーションから電子メールを送信できます。このパッケージは、Oracleで提供されるUTL_SMTPパッケージをベースとして構築されています。このような依存性があるため、APEX_MAILを使用するには、UTL_SMTPパッケージがインストールされており、機能している必要があります。


参照:

UTL_SMTPパッケージの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。

APEX_MAILには3つのプロシージャが含まれています。アプリケーションから外部へ電子メール・メッセージを送信するには、APEX_MAIL.SENDを使用します。APEX_MAIL_QUEUEに格納されたメール・メッセージを配信するには、APEX_MAIL.PUSH_QUEUEを使用します。アプリケーションから外部へ添付ファイルとして電子メール・メッセージを送信するには、APEX_MAIL.ADD_ATTACHMENTを使用します。

トピック:


注意:

電子メールを送信する最も効率的な方法は、DBMS_JOBまたはDBMS_SCHEDULERパッケージを使用してバックグラウンド・ジョブを作成し、アクティブなメール・キューに格納されているすべてのメール・メッセージを定期的に送信することです。Application Expressアプリケーションのコンテキストの外部からAPEX_MAILパッケージをコールするには、次の例のようにapex_util.set_security_group_idをコールする必要があります。
for c1 in (
   select workspace_id
     from apex_applications
    where application_id = p_app_id )
loop
   apex_util.set_security_group_id(p_security_group_id =>
c1.workspace_id);
end loop;


参照:

『Oracle Application Expressアプリケーション・ビルダー・ユーザーズ・ガイド』の「アプリケーションからの電子メールの送信」

電子メールを送信するためのOracle Application Expressの構成の概要

アプリケーション・ビルダー・アプリケーションから電子メールを送信する前に、次のステップを実行する必要があります。

  1. Oracle Application Express管理サービスにログインし、インスタンスの設定ページで電子メール設定を構成します。『Oracle Application Express管理ガイド』を参照してください。

  2. さらに、Oracle Database 11g リリース1(11.1)でOracle Application Expressを実行している場合、外部へのメールを有効化する必要があります。Oracle Database 11g リリース1(11.1)では、ネットワーク・サービスと通信する機能はデフォルトで無効になっています。『Oracle Application Expressアプリケーション・ビルダー・ユーザーズ・ガイド』のOracle Database 11gのネットワーク・サービスの有効化に関するセクションを参照してください。


ヒント:

新しいワークスペースリクエストが承認されたときにユーザーにログイン資格証明が電子メールで自動的に送信されるように、Oracle Application Expressを構成できます。詳細は、『Oracle Application Express管理ガイド』の「割当てモードの指定」を参照してください。

ADD_ATTACHMENTプロシージャ

このプロシージャは、アプリケーションから外部へ電子メール・メッセージを添付ファイルとして送信します。1つの電子メールに複数の添付ファイルを追加するには、1つの電子メール・メッセージに対してAPEX_MAIL.ADD_ATTACHMENTを繰り返しコールします。

構文

APEX_MAIL.ADD_ATTACHMENT(
    p_mail_id                   IN    NUMBER,
    p_attachment                IN    BLOB,
    p_filename                  IN    VARCHAR2,
    p_mime_type                 IN    VARCHAR2);

パラメータ

表16-1では、ADD_ATTACHMENTプロシージャで使用可能なパラメータについて説明します。

表16-1 ADD_ATTACHMENTのパラメータ

パラメータ 説明

p_mail_id

電子メールに関連付けられている数値ID。これは、電子メールの本文を作成するAPEX_MAIL.SENDのコールから戻される数値識別子です。

p_attachment

電子メール・メッセージに添付するバイナリ・コンテンツを含むBLOB変数。

p_filename

電子メール添付ファイルに関連付けられているファイル名。

p_mime_type

電子メールの添付ファイルに関連付けられる有効なMIMEタイプ(またはインターネット・メディア・タイプ)。


次の例に、APEX_APPLICATION_FILESに格納されているファイルにアクセスする方法、およびこれらを外部への電子メール・メッセージに追加する方法を示します

DECLARE
    l_id NUMBER;
BEGIN
    l_id := APEX_MAIL.SEND(
        p_to        => 'fred@flintstone.com',
        p_from      => 'barney@rubble.com',
        p_subj      => 'APEX_MAIL with attachment',
        p_body      => 'Please review the attachment.',
        p_body_html => '<b>Please</b> review the attachment');
    FOR c1 IN (SELECT filename, blob_content, mime_type 
        FROM APEX_APPLICATION_FILES
        WHERE ID IN (123,456)) LOOP

        APEX_MAIL.ADD_ATTACHMENT(
            p_mail_id    => l_id,
            p_attachment => c1.blob_content,
            p_filename   => c1.filename,
            p_mime_type  => c1.mime_type);
        END LOOP;
    COMMIT;
END;
/

GET_IMAGES_URLファンクション

このファンクションは、電子メールにApplication Expressインスタンスのイメージが含まれるときに、前にURLを付けたイメージを取得します。

構文

APEX_MAIL.GET_IMAGES_URL return VARCHAR2;

パラメータ

なし。

次の例では、Oracleロゴのイメージを含む注文確認の電子メールを送信します。

declare
    l_body      clob;
    l_body_html clob;
begin
    l_body := 'To view the content of this message, please use an HTML enabled mail client.' || utl_tcp.crlf;
 
    l_body_html := '<html><body>' || utl_tcp.crlf ||
                   '<p>Please confirm your order on the <a href="' ||
                   apex_mail.get_instance_url || 'f?p=100:10">Order Confirmation</a> page.</p>' || utl_tcp.crlf ||
                   '<p>Sincerely,<br />' || utl_tcp.crlf ||
                   'The Application Express Dev Team<br />' || utl_tcp.crlf ||
                   '<img src="' || apex_mail.get_images_url || 'oracle.gif" alt="Oracle Logo"></p>' || utl_tcp.crlf ||
                   '</body></html>'; 
    apex_mail.send (
        p_to        => 'some_user@somewhere.com',   -- change to your email address
        p_from      => 'some_sender@somewhere.com', -- change to a real senders email address
        p_body      => l_body,
        p_body_html => l_body_html,
        p_subj      => 'Order Confirmation' );
end;

GET_INSTANCE_URLファンクション

このファンクションは、電子メールにApplication Expressインスタンスへのリンクが含まれるときに、インスタンスのURLを取得します。


注意:

このファンクションでは、電子メールにインスタンス設定Application Express Instance URLが設定されている必要があります。

構文

APEX_MAIL.GET_IMAGES_URL return VARCHAR2;

パラメータ

なし。

次の例では、アプリケーション100のページ10への絶対URLを含む、注文確認の電子メールを送信します。

declare
    l_body      clob;
    l_body_html clob;
begin
    l_body := 'To view the content of this message, please use an HTML enabled mail client.' || utl_tcp.crlf;
 
    l_body_html := '<html><body>' || utl_tcp.crlf ||
                   '<p>Please confirm your order on the <a href="' ||
                   apex_mail.get_instance_url || 'f?p=100:10">Order Confirmation</a> page.</p>' || utl_tcp.crlf ||
                   '</body></html>'; 
    apex_mail.send (
        p_to        => 'some_user@somewhere.com',   -- change to your email address
        p_from      => 'some_sender@somewhere.com', -- change to a real senders email address
        p_body      => l_body,
        p_body_html => l_body_html,
        p_subj      => 'Order Confirmation' );
end;

PUSH_QUEUEプロシージャ

Oracle Application Expressでは、APEX_MAIL_QUEUEという名前の表に未送信の電子メール・メッセージが格納されます。APEX_MAIL.PUSH_QUEUEプロシージャを呼び出して、このキューに格納されているメール・メッセージを指定のSMTPゲートウェイに手動で送信できます。

Oracle Application Expressによって、正常に送信されたメッセージのログが、サーバーのローカル時間でのタイムスタンプとともにAPEX_MAIL_LOGに作成されます。電子メールを送信するための最も有効な方法は、バックグラウンド・ジョブ(DBMS_JOBパッケージを使用)を作成して、アクティブなメール・キューに格納されているすべてのメール・メッセージを定期的に送信することです。


参照:

『Oracle Application Expressアプリケーション・ビルダー・ユーザーズ・ガイド』の「アプリケーションからの電子メールの送信」

構文

APEX_MAIL.PUSH_QUEUE(
    p_smtp_hostname             IN    VARCHAR2 DEFAULT NULL,
    p_smtp_portno               IN    NUMBER   DEFAULT NULL);

パラメータ

表16-2に、PUSH_QUEUEプロシージャで使用可能なパラメータを示します。

表16-2 PUSH_QUEUEのパラメータ

パラメータ 説明

p_smtp_hostname

SMTPゲートウェイのホスト名

p_smtp_portno

SMTPゲートウェイのポート番号


これらのパラメータの値は下位互換性を確保するために提供されていますが、各パラメータの値は無視されます。電子メールを送信する際のSMTPゲートウェイのホスト名およびSMTPゲートウェイのポート番号は、「環境設定の管理」で入力された値のみが使用されます。


参照:

『Oracle Application Express管理ガイド』の「電子メール設定の構成」

次の例に、シェル・スクリプトを使用してAPEX_MAIL.PUSH_QUEUEプロシージャを使用する方法を示します。この例はUNIX/LINUXインストールにのみ適用します。

SQLPLUS / <<EOF
APEX_MAIL.PUSH_QUEUE;
DISCONNECT
EXIT
EOF

参照:

『Oracle Application Expressアプリケーション・ビルダー・ユーザーズ・ガイド』の「アプリケーションからの電子メールの送信」

SENDプロシージャ

このプロシージャは、アプリケーションから外部へ電子メール・メッセージを送信します。このプロシージャを使用してVARCHAR2またはCLOBp_bodyおよびp_body_htmlに渡すことができますが、データ型は同じである必要があります。つまり、CLOBP_BODYに、VARCHAR2p_body_htmlに渡すことはできません。

APEX_MAIL.SENDを使用する際は、次の点に注意してください。

構文

APEX_MAIL.SEND(
    p_to                        IN    VARCHAR2,
    p_from                      IN    VARCHAR2,
    p_body                      IN  [ VARCHAR2 | CLOB ],
    p_body_html                 IN  [ VARCHAR2 | CLOB ] DEFAULT NULL,
    p_subj                      IN    VARCHAR2 DEFAULT NULL,
    p_cc                        IN    VARCHAR2 DEFAULT NULL,
    p_bcc                       IN    VARCHAR2 DEFAULT NULL,
    p_replyto                   IN    VARCHAR2);

パラメータ

表16-3では、SENDプロシージャで使用可能なパラメータについて説明します。

表16-3 SENDのパラメータ

パラメータ 説明

p_to

電子メールの送信先となる有効な電子メール・アドレス(必須)。電子メール・アドレスが複数の場合、カンマで区切られたリストを使用します。

p_from

電子メールの送信元となる電子メール・アドレス(必須)。この電子メール・アドレスは有効なアドレスである必要があります。有効でない場合、メッセージは送信されません。

p_body

HTML形式ではなく、プレーン・テキスト形式の電子メールの本文(必須)。値がp_body_htmlに渡された場合、受信者に表示されるテキストはこれだけです。値がp_body_htmlに渡されなかった場合、このテキストは、HTMLをサポートしていない電子メール・クライアント、またはHTMLが無効になっている電子メール・クライアントに対してのみ表示されます。キャリッジ・リターンまたはライン・フィード(CRLF)を1000文字ごとに含める必要があります。

p_body_html

HTML形式の電子メールの本文。これは、<html>タグおよび<body>タグを含む完全なHTMLドキュメントである必要があります。キャリッジ・リターンまたはライン・フィード(CRLF)を使用しない場合、1行は1000文字以下にする必要があります。

p_subj

電子メールの件名

p_cc

電子メールの内容のコピー先となる有効な電子メール・アドレス。電子メール・アドレスが複数の場合、カンマで区切られたリストを使用します。

p_bcc

電子メールの内容のブラインド・コピー先となる有効な電子メール・アドレス。電子メール・アドレスが複数の場合、カンマで区切られたリストを使用します。

p_replyto

返信先のメール・ヘッダーのアドレス。このパラメータの使用方法は次のとおりです。

  • p_replytoパラメータを省略した場合、返信先のメール・ヘッダーにはp_fromパラメータに指定された値が設定されます

  • p_replytoパラメータにNULLを指定した場合、返信先のメール・ヘッダーにはNULLが設定されます。この結果、電子メールの自動返信は行われません

  • p_replytoパラメータにNULL以外の値(有効な電子メール・アドレスなど)を指定した場合、メッセージを送信しても、自動返信は指定されたアドレスに対して行われます(有効な電子メール・アドレスなど)


次の例では、APEX_MAIL.SENDを使用してアプリケーションからプレーン・テキストの電子メール・メッセージを送信する方法を示します。

-- Example One: Plain Text only message
DECLARE
    l_body      CLOB;
BEGIN
    l_body := 'Thank you for your interest in the APEX_MAIL 
package.'||utl_tcp.crlf||utl_tcp.crlf;
    l_body := l_body ||'  Sincerely,'||utl_tcp.crlf;
    l_body := l_body ||'  The Application Express Dev Team'||utl_tcp.crlf;
    apex_mail.send(
        p_to       => 'some_user@somewhere.com',   -- change to your email address
        p_from     => 'some_sender@somewhere.com', -- change to a real senders email address
        p_body     => l_body,
        p_subj     => 'APEX_MAIL Package - Plain Text message');
END;
/

次の例では、APEX_MAIL.SENDを使用してアプリケーションからHTML形式の電子メール・メッセージを送信する方法を示します。キャリッジ・リターンまたはライン・フィード(CRLF)を 1000文字ごとに含める必要があります。次の例では、utl_tcp.crlfを使用します。

-- Example Two: Plain Text / HTML message
DECLARE
    l_body      CLOB;
    l_body_html CLOB;
BEGIN
    l_body := 'To view the content of this message, please use an HTML enabled mail client.'||utl_tcp.crlf;

    l_body_html := '<html>
        <head>
            <style type="text/css">
                body{font-family: Arial, Helvetica, sans-serif;
                    font-size:10pt;
                    margin:30px;
                    background-color:#ffffff;}

                span.sig{font-style:italic;
                    font-weight:bold;
                    color:#811919;}
             </style>
         </head>
         <body>'||utl_tcp.crlf;
    l_body_html := l_body_html ||'<p>Thank you for your interest in the <strong>APEX_MAIL</strong> package.</p>'||utl_tcp.crlf;
    l_body_html := l_body_html ||'  Sincerely,<br />'||utl_tcp.crlf;
    l_body_html := l_body_html ||'  <span class="sig">The Application Express Dev Team</span><br />'||utl_tcp.crlf;
    l_body_html := l_body_html ||'</body></html>'; 
    apex_mail.send(
    p_to   => 'some_user@somewhere.com',   -- change to your email address
    p_from => 'some_sender@somewhere.com', -- change to a real senders email address
    p_body      => l_body,
    p_body_html => l_body_html,
    p_subj      => 'APEX_MAIL Package - HTML formatted message');
END;
/