最近、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認証を使用した添付ファイル付きのメールの送信例