sql >> データベース >  >> RDS >> Oracle

PL / SQLMail_ClientAPIを使用してメールボックスからメッセージを取得する

    最近、OracleApexで一種のメールクライアントシステムを構築するタスクを取得しました。要件は、ユーザーが電子メールメッセージや添付ファイルを表示したり、メッセージを削除したりできるように、特定のアカウントのページにメール受信ボックスのメッセージを表示することでした。ただし、Oracleには、UTL_SMPT、UTL_MAILを使用して電子メールを送信するパッケージがあります。 、およびAPEX_MAILであり、メールボックスからメールメッセージを取得するためのパッケージはありません。少し検索したところ、CarstenCzarskiによって作成されたPL/ SQL MAIL_CLIENT APIが見つかりました。これを使用すると、メールボックスからメッセージを簡単に取得できます。このチュートリアルでは、 MAIL_CLIENT APIの例を示します。 コマンドと手順。まず、 PL / SQL MAIL_CLIENTをダウンロードしてインストールします。 次のリンクを使用します:

    PL / SQLMAIL_CLIENTAPIをダウンロード

    PL / SQLMAIL_CLIENTAPIの例

    次のセクションでは、MAIL_CLIENTパッケージを使用して接続するためのステップバイステップの例を示し、次にメールボックスの内容を表示する方法、特定のメッセージとその添付ファイルを表示する方法などを示します。

    例-1:MAIL_CLIENTを使用して接続する

    メールサーバーに接続するには、次のPL/SQLコードを使用します。

    begin
      mail_client.connect_server(
        p_hostname => 'YourMailServer.com',
        p_port     => YourPortIntegerValue,
        p_protocol => mail_client.protocol_IMAP, -- or mail_client.protocol_POP3
        p_userid   => 'YourUserID',
        p_passwd   => 'YourPassword',
        p_ssl      => true -- true or false depends on your mailbox
      );
    
      mail_client.open_inbox;
      dbms_output.put_line('Mailbox successfully opened.');
      dbms_output.put_line('The INBOX folder contains '||mail_client.get_message_count||' messages.');
    end;
    /

    メールボックスの設定に応じて、ホスト名、ポート、プロトコル、ユーザーID、およびパスワードを変更します。上記のコードを実行すると、メールボックスに接続されます。これで、受信トレイの内容を確実に表示したいと思うでしょう。次のコマンドを使用します:

    例2:メールボックスの内容を表示する

    PL / SQL MAIL_CLIENT APIを使用してメールボックスの内容を表示するには、次のSQL文を実行して最新のメッセージを表示します。

    select * from table(mail_client.get_mail_headers()) order by msg_number desc;

    上記のクエリから次の列が表示されます:

    • MSG_NUMBER
    • 件名
    • 送信者
    • SENDER_EMAIL
    • SENT_DATE
    • CONTENT_TYPE
    • 削除済み
    • さらにいくつかのフラグ列

    例3:メールメッセージの構造を取得する

    メールメッセージの構造には、 PARTINDEXなどの情報が含まれています。 numberには、プレーンテキスト形式の本文部分、HTML形式の本文部分、およびメールの添付ファイルが含まれます。電子メール本文部分のプレーンテキストを取得する場合は、次のSQLクエリを実行します。

    select * from table(mail_client.get_message(1).get_structure());

    上記の値1は、 MSG_NUMBERです。 メッセージの。次の情報が表示されます:

    • PARTINDEX
    • PARENTINDEX
    • CONTENT_TYPE
    • サイズなど
    PARTINDEX PARENTINDEX CONTENT_TYPE サイズ
    0,0 0 テキスト/プレーン 2993
    0,1 1 text / html 94849
    1 1 マルチパート/レポート 39398

    例-4:メッセージ本文を取得する

    たとえば、メッセージ番号1のメッセージ本文をプレーンテキスト形式で取得する場合は、次のクエリを実行します。

    SELECT Mail_Client.Get_Message(1 /* specify message number */).get_bodypart_content_varchar2('0,0')
                 FROM Dual;

    注: 上記の0,0は、テキスト/プレーンコンテンツタイプのPARTINDEX列の値です。

    本文をHTML形式で取得するには、 PARTINDEXを使用して次のクエリを実行します。 列の値0,1。 CLOBで本文を返します :

    SELECT Mail_Client.Get_Message(1 /* specify message number */).get_bodypart_content_clob('0,1')
                FROM Dual;

    例-5:メールの添付ファイルを取得する

    同様に、 PARTINDEXを使用してメールの添付ファイルを取得します 以下のクエリに示すように、パラメータとして値1:

    SELECT Mail_Client.Get_Message(1 /* specify message number */).Get_Bodypart_Content_Blob('1')
                 FROM Dual;

    例-6:メールメッセージを削除する

    以下は、MAIL_CLIENTAPIを使用してメールメッセージを削除するためのストアドプロシージャの例です。

    Create or Replace PROCEDURE Delete_Mail_Msg(i_Msg_Number IN NUMBER) IS
         
    t_Msg Mail_t;
    
    BEGIN
    
    Mail_Client.Connect_Server(p_Hostname => 'YourMailServer',
                               p_Port     => MailServerPort,
                               p_Protocol => Mail_Client.Protocol_Imap,
                               p_Userid   => 'username',
                               p_Passwd   => 'password',
                               p_Ssl      => TRUE);
    
    Mail_Client.Open_Inbox;
    
    t_Msg := Mail_Client.Get_Message(i_Msg_Number);
    t_Msg.Mark_Deleted();
    
    Mail_Client.Expunge_Folder;
    Mail_Client.Close_Folder;
    Mail_Client.Disconnect_Server;
    
    EXCEPTION
         WHEN OTHERS THEN
           IF Mail_Client.Is_Connected() = 1 THEN
             Mail_Client.Close_Folder;
             Mail_Client.Disconnect_Server;
           END IF;
           Raise;
       END Delete_Mail_Msg;

    次に、上記のプロシージャを呼び出して、パラメータとして渡された特定のメールメッセージを削除します。以下に例を示します。

    Begin
       Delete_Mail_Msg(3);
    End;

    上記のプロシージャDELETE_MAIL_MSGの呼び出し メールメッセージ番号3をサーバーから削除します。

    また、すべての受信トレイメッセージをメール本文と添付ファイル付きのテーブルに保存する例を以下に示します。次の手順に従ってください:

    ステップ-1:テーブルを作成します。

    CREATE TABLE MAIL_INBOX (
    MSG_NUMBER INTEGER,
    SUBJECT VARCHAR2(4000),
    SENT_DATE DATE,
    SENDER_EMAIL,
    BODY_TEXT CLOB,
    MAIL_ATTACHMENT BLOB)
    /

    ステップ2:Oracle PL/SQLストアドプロシージャを作成する

    CREATE OR REPLACE PROCEDURE LOAD_EMAILS IS

    CURSOR c_Inbox IS
    SELECT Msg_Number,
    Subject,
    Sender,
    Sender_Email,
    Sent_Date,
    Content_Type
    FROM TABLE(Mail_Client.Get_Mail_Headers())
    ORDER BY Msg_Number DESC;

    c_Clob CLOB;
    b_blob BLOB;

    t_Msg Mail_t;

    v_Partindex VARCHAR2(100);
    BEGIN

    Mail_Client.Connect_Server(p_Hostname => 'YOURMAILSERVER',
    p_Port => YOURPORT,
    p_Protocol => Mail_Client.Protocol_Imap,
    p_Userid => 'USERID',
    p_Passwd => 'PASSWORD',
    p_Ssl => TRUE);

    Mail_Client.Open_Inbox;

    FOR c IN c_Inbox LOOP

    Dbms_Lob.Createtemporary(Lob_Loc => c_Clob,
    Cache => TRUE,
    Dur => Dbms_Lob.Call);

    Dbms_Lob.Createtemporary(Lob_Loc => b_blob,
    Cache => TRUE,
    Dur => Dbms_Lob.Call);

    IF Substr(c.Content_Type,
    1,
    9) = 'multipart' THEN
    v_Partindex := NULL;
    BEGIN
    SELECT Partindex
    INTO v_Partindex
    FROM TABLE(Mail_Client.Get_Message(c.Msg_Number).Get_Structure())
    WHERE Substr(Content_Type,
    1,
    9) = 'text/html';
    EXCEPTION
    WHEN OTHERS THEN
    NULL;
    END;

    IF v_Partindex IS NOT NULL THEN

    BEGIN
    SELECT Mail_Client.Get_Message(c.Msg_Number).Get_Bodypart_Content_Clob(v_Partindex)
    INTO c_Clob
    FROM Dual;
    EXCEPTION
    WHEN OTHERS THEN
    NULL;
    END;

    BEGIN
    SELECT Mail_Client.Get_Message(c.Msg_Number).Get_Bodypart_Content_BLOB('1')
    INTO b_blob
    FROM Dual;
    EXCEPTION
    WHEN OTHERS THEN
    NULL;
    END;

    END IF;
    INSERT INTO mail_inbox
    (Msg_Number,
    Subject,
    Sent_Date,
    Sender_email,
    Body_Text,
    mail_attachment)
    VALUES
    (c.Msg_Number,
    c.Subject,
    c.Sent_Date,
    c.Sender_Email,
    c_Clob,
    b_blob);
    ELSIF Substr(c.Content_Type,
    1,
    9) = 'text/html' THEN

    BEGIN
    SELECT Mail_Client.Get_Message(c.Msg_Number).Get_Content_Clob()
    INTO c_Clob
    FROM Dual;
    EXCEPTION
    WHEN OTHERS THEN
    NULL;
    END;

    INSERT INTO mail_inbox
    (Msg_Number,
    Subject,
    Sent_Date,
    Sender_email,
    Body_Text)
    VALUES
    (c.Msg_Number,
    c.Subject,
    c.Sent_Date,
    c.Sender_Email
    c_Clob);

    END IF;
    END LOOP;
    COMMIT;
    Mail_Client.Close_Folder;
    Mail_Client.Disconnect_Server;

    EXCEPTION
    WHEN OTHERS THEN
    ROLLBACK;

    IF Mail_Client.Is_Connected() = 1 THEN
    Mail_Client.Close_Folder;
    Mail_Client.Disconnect_Server;
    END IF;
    RAISE;

    END LOAD_EMAILS;

    上記の手順を実行して、次のようにテーブルに電子メールメッセージを入力します。

    Begin
    Load_Emails;
    End;

    これで、テーブル MAIL_INBOXをクエリできます。 メールメッセージを表示します。

    Select * from mail_inbox;
    このプロジェクトをGitHubからダウンロードします

    関連チュートリアル:

    • PL / SQLのファイルからBLOBを取得するにはどうすればよいですか?
    • Oracle UTL_SMTP:OracleWallet認証を使用した添付ファイル付きのメールの送信例
    1. 非主キーへの外部キー

    2. MySQL整数フィールドはPHPで文字列として返されます

    3. phpとjqueryのロケーションファインダースクリプトを使用したインドのピンコードデータベース

    4. SQLServerで自動インクリメント主キーを定義する方法