Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Lấy thư từ Hộp thư bằng API PL / SQL Mail_Client

Gần đây, tôi đã nhận nhiệm vụ xây dựng một loại hệ thống ứng dụng thư trong Oracle Apex. Yêu cầu là hiển thị các thư của Hộp thư đến trên một trang cho một tài khoản cụ thể để người dùng có thể xem các thư email, tệp đính kèm và có thể xóa thư, v.v. Nhưng trong Oracle, có các gói để gửi email bằng UTL_SMPT, UTL_MAIL và APEX_MAIL, và không có gói nào để truy xuất thư từ hộp thư. Sau khi tìm kiếm một chút, tôi đã tìm thấy một API PL / SQL MAIL_CLIENT được viết bởi Carsten Czarski, với đó bạn có thể dễ dàng truy xuất các thư từ hộp thư. Và trong hướng dẫn này, tôi đưa ra các ví dụ về API MAIL_CLIENT các lệnh và thủ tục. Trước tiên, hãy tải xuống và cài đặt PL / SQL MAIL_CLIENT sử dụng liên kết sau:

Tải xuống PL / SQL MAIL_CLIENT API

Ví dụ về API PL / SQL MAIL_CLIENT

Trong các phần sau, tôi sẽ đưa ra các ví dụ từng bước để kết nối bằng cách sử dụng gói MAIL_CLIENT, sau đó là cách xem nội dung hộp thư, cách xem một thư cụ thể và các tệp đính kèm, v.v.

Ví dụ-1:Kết nối bằng MAIL_CLIENT

Để kết nối với máy chủ thư, hãy sử dụng mã PL / SQL sau:

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;
/

Thay đổi tên máy chủ, cổng, giao thức, id người dùng và mật khẩu theo cài đặt hộp thư của bạn. Và sau khi thực hiện đoạn mã trên, bạn sẽ được kết nối với hộp thư của mình. Bây giờ chắc chắn bạn muốn xem nội dung trong hộp thư đến của mình. Sử dụng lệnh sau:

Ví dụ-2:Xem Nội dung Hộp thư

Để xem nội dung hộp thư bằng API PL / SQL MAIL_CLIENT, hãy chạy câu lệnh SQL sau để xem các thư mới nhất ở trên cùng:

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

Bạn sẽ nhận được các cột sau từ truy vấn trên:

  • MSG_NUMBER
  • CHỦ ĐỀ
  • SENDER
  • SENDER_EMAIL
  • SENT_DATE
  • CONTENT_TYPE
  • ĐÃ XÓA
  • Một số cột cờ khác

Ví dụ-3:Lấy cấu trúc của thư

Cấu trúc của thư chứa thông tin, chẳng hạn như PARTINDEX number chứa phần nội dung ở định dạng văn bản thuần túy, phần nội dung ở định dạng HTML và các tệp đính kèm của thư. Giả sử bạn muốn lấy văn bản thuần túy của phần nội dung email, hãy chạy các truy vấn SQL sau:

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

Giá trị 1 ở trên là MSG_NUMBER trong số các tin nhắn. Nó sẽ cung cấp cho bạn những thông tin sau:

  • PARTINDEX
  • PARENTINDEX
  • CONTENT_TYPE
  • KÍCH THƯỚC, v.v.
PARTINDEX PARENTINDEX CONTENT_TYPE KÍCH THƯỚC
0,0 0 văn bản / đơn giản 2993
0,1 1 text / html 94849
1 1 nhiều phần / báo cáo 39398

Ví dụ-4:Lấy nội dung thư

Bây giờ, ví dụ:nếu bạn muốn nhận nội dung thư ở định dạng văn bản thuần túy cho thư số 1, hãy chạy truy vấn sau:

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

Lưu ý: 0,0 ở trên là giá trị của cột PARTINDEX cho loại nội dung văn bản / nội dung thuần túy.

Để lấy nội dung ở định dạng HTML, chúng tôi sẽ chạy truy vấn sau với PARTINDEX giá trị cột 0,1. Nó sẽ trả lại phần thân trong CLOB :

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

Ví dụ-5:Lấy Tệp đính kèm Thư

Tương tự, lấy tệp đính kèm thư bằng cách sử dụng PARTINDEX giá trị 1 làm tham số, như được hiển thị trong truy vấn bên dưới:

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

Ví dụ-6:Xóa Thư

Dưới đây là ví dụ về quy trình được lưu trữ để xóa thư bằng cách sử dụng 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;

Bây giờ chỉ cần gọi thủ tục trên để xóa một thư cụ thể, được truyền dưới dạng tham số. Dưới đây là ví dụ:

Begin
   Delete_Mail_Msg(3);
End;

Lệnh gọi thủ tục DELETE_MAIL_MSG ở trên sẽ xóa thông báo email số 3 khỏi máy chủ.

Ngoài ra, đưa ra ví dụ dưới đây để lưu trữ tất cả các thư hộp thư đến vào một bảng có nội dung thư và tệp đính kèm. Làm theo các bước sau:

Bước-1:Tạo bảng.

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

Bước-2:Tạo thủ tục lưu trữ 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;

Chạy quy trình trên để điền vào bảng các thông báo email như sau:

Begin
Load_Emails;
End;

Bây giờ bạn có thể truy vấn bảng MAIL_INBOX để xem các tin nhắn email.

Select * from mail_inbox;
Tải xuống dự án này từ GitHub

Hướng dẫn liên quan:

  • Cách tải BLOB từ tệp trong PL / SQL?
  • Oracle UTL_SMTP:Ví dụ về Gửi Thư có Tệp đính kèm Sử dụng Xác thực Ví Oracle
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để chuyển đổi các giá trị được phân tách bằng dấu phẩy thành các hàng trong oracle?

  2. So sánh với ngày tháng trong Oracle sql

  3. Nhận đầu ra từ dbms_output.get_lines bằng JDBC

  4. Làm cách nào để sử dụng một tham số động trong mệnh đề IN của truy vấn có tên JPA?

  5. Hàm ROWIDTOCHAR () trong Oracle