Baru-baru ini saya mendapat tugas untuk membangun semacam sistem klien email di Oracle Apex. Persyaratannya adalah untuk menampilkan pesan kotak masuk surat pada halaman untuk akun tertentu sehingga pengguna dapat melihat pesan email, lampiran dan dapat menghapus pesan, dll. Tetapi di Oracle, ada paket untuk mengirim email menggunakan UTL_SMPT, UTL_MAIL , dan APEX_MAIL, dan tidak ada paket untuk mengambil pesan email dari kotak surat. Setelah mencari sedikit, saya menemukan PL/SQL MAIL_CLIENT API yang ditulis oleh Carsten Czarski, yang dengannya Anda dapat dengan mudah mengambil pesan dari kotak surat. Dan dalam tutorial ini, saya memberikan contoh MAIL_CLIENT API perintah dan prosedur. Pertama, unduh dan instal PL/SQL MAIL_CLIENT menggunakan tautan berikut:
Unduh PL/SQL MAIL_CLIENT API
Contoh API PL/SQL MAIL_CLIENT
Di bagian berikut, saya akan memberikan contoh langkah demi langkah untuk menghubungkan menggunakan paket MAIL_CLIENT, lalu cara melihat isi kotak surat, cara melihat pesan tertentu dan lampirannya, dll.
Contoh-1:Terhubung Menggunakan MAIL_CLIENT
Untuk terhubung ke server email, gunakan kode PL/SQL berikut:
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; /
Ubah nama host, port, protokol, id pengguna, dan kata sandi sesuai dengan pengaturan kotak surat Anda. Dan setelah mengeksekusi kode di atas Anda akan terhubung ke kotak surat Anda. Sekarang pasti Anda ingin melihat isi kotak masuk Anda. Gunakan perintah berikut:
Contoh-2:Melihat Isi Kotak Surat
Untuk melihat isi kotak surat menggunakan PL/SQL MAIL_CLIENT API, jalankan pernyataan SQL berikut untuk melihat pesan terbaru di atas:
select * from table(mail_client.get_mail_headers()) order by msg_number desc;
Anda akan mendapatkan kolom berikut dari kueri di atas:
- MSG_NUMBER
- SUBJEK
- PENGIRIM
- SENDER_EMAIL
- TANGGAL_SENI
- CONTENT_TYPE
- DIHAPUS
- Beberapa kolom bendera lagi
Contoh-3:Dapatkan Struktur Pesan Email
Struktur pesan email berisi informasi, seperti yang PARTINDEX nomor berisi bagian tubuh dalam format teks biasa, bagian tubuh dalam format HTML, dan lampiran surat. Misalkan Anda ingin mendapatkan teks biasa dari bagian badan email, jalankan kueri SQL berikut:
select * from table(mail_client.get_message(1).get_structure());
Nilai 1 di atas adalah MSG_NUMBER dari pesan-pesan. Ini akan memberi Anda informasi berikut:
- PARTINDEX
- PARENTINDEX
- CONTENT_TYPE
- UKURAN, dll.
PARTINDEX | PARENTINDEX | CONTENT_TYPE | UKURAN |
0,0 | 0 | teks/polos | 2993 |
0,1 | 1 | teks/html | 94849 |
1 | 1 | multibagian/laporan | 39398 |
Contoh-4:Ambil Isi Pesan
Sekarang misalnya, jika Anda ingin mendapatkan isi pesan dalam format teks biasa untuk pesan nomor 1, jalankan kueri berikut:
SELECT Mail_Client.Get_Message(1 /* specify message number */).get_bodypart_content_varchar2('0,0') FROM Dual;
Catatan: 0,0 di atas adalah nilai kolom PARTINDEX untuk tipe konten teks/polos.
Untuk mendapatkan body dalam format HTML, kita akan menjalankan query berikut dengan PARTINDEX nilai kolom 0,1. Ini akan mengembalikan tubuh dalam CLOB :
SELECT Mail_Client.Get_Message(1 /* specify message number */).get_bodypart_content_clob('0,1') FROM Dual;
Contoh-5:Dapatkan Lampiran Email
Demikian pula, dapatkan lampiran email menggunakan PARTINDEX nilai 1 sebagai parameter, seperti yang ditunjukkan pada kueri di bawah ini:
SELECT Mail_Client.Get_Message(1 /* specify message number */).Get_Bodypart_Content_Blob('1') FROM Dual;
Contoh-6:Menghapus Pesan Email
Di bawah ini adalah contoh prosedur tersimpan untuk menghapus pesan email, menggunakan API MAIL_CLIENT.
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;
Sekarang panggil saja prosedur di atas untuk menghapus pesan email tertentu, yang diteruskan sebagai parameter. Di bawah ini contohnya:
Begin Delete_Mail_Msg(3); End;
Panggilan di atas untuk prosedur DELETE_MAIL_MSG akan menghapus pesan email nomor 3 dari server.
Juga, berikan contoh di bawah ini untuk menyimpan semua pesan kotak masuk ke tabel dengan badan surat dan lampiran. Ikuti langkah-langkah berikut:
Langkah-1:Buat Tabel.
CREATE TABLE MAIL_INBOX ( MSG_NUMBER INTEGER, SUBJECT VARCHAR2(4000), SENT_DATE DATE, SENDER_EMAIL, BODY_TEXT CLOB, MAIL_ATTACHMENT BLOB) /
Langkah-2:Buat Prosedur Tersimpan 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;
Jalankan prosedur di atas untuk mengisi tabel dengan pesan email sebagai berikut:
Begin
Load_Emails;
End;
Sekarang Anda dapat membuat kueri tabel MAIL_INBOX untuk melihat pesan email.
Select * from mail_inbox;Unduh proyek ini dari GitHub
Tutorial Terkait:
- Bagaimana Cara Mendapatkan BLOB dari File di PL/SQL?
- Oracle UTL_SMTP:Kirim Email dengan Contoh Lampiran Menggunakan Otentikasi Oracle Wallet
-
Bagaimana cara mengurutkan berdasarkan angka terlebih dahulu dengan kueri Oracle SQL?
-
Oracle SQL Where klausa untuk menemukan catatan tanggal yang lebih lama dari 30 hari
-
Fungsi GREATEST() di Oracle
-
Dapatkan perbedaan antara dua tanggal baik Dalam Bulan dan hari di sql
-
Bagaimana cara mengecilkan tablespace temp di Oracle?