Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Ambil Pesan dari Kotak Surat Menggunakan PL/SQL Mail_Client API

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengurutkan berdasarkan angka terlebih dahulu dengan kueri Oracle SQL?

  2. Oracle SQL Where klausa untuk menemukan catatan tanggal yang lebih lama dari 30 hari

  3. Fungsi GREATEST() di Oracle

  4. Dapatkan perbedaan antara dua tanggal baik Dalam Bulan dan hari di sql

  5. Bagaimana cara mengecilkan tablespace temp di Oracle?