Oracle
 sql >> база данни >  >> RDS >> Oracle

Извличане на съобщения от пощенска кутия с помощта на PL/SQL Mail_Client API

Наскоро получих задачата да създам един вид система за пощенски клиент в Oracle Apex. Изискването беше да се показват съобщенията от входящата поща на страница за конкретен акаунт, така че потребителят да може да вижда имейл съобщенията, прикачените файлове и да изтрива съобщенията и т.н. Но в Oracle има пакети за изпращане на имейли чрез UTL_SMPT, UTL_MAIL , и APEX_MAIL и няма пакет за извличане на пощенските съобщения от пощенската кутия. След като потърсих малко, намерих PL/SQL MAIL_CLIENT API, написан от Карстен Чарски, с който лесно можете да извлечете съобщенията от пощенската кутия. И в този урок давам примери за MAIL_CLIENT API команди и процедури. Първо, изтеглете и инсталирайте PL/SQL MAIL_CLIENT като използвате следната връзка:

Изтеглете PL/SQL MAIL_CLIENT API

Примери за API на PL/SQL MAIL_CLIENT

В следващите раздели давам стъпка по стъпка примери за свързване с помощта на пакета 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;
/

Променете името на хоста, порта, протокола, потребителския идентификатор и паролата според настройките на вашата пощенска кутия. И след като изпълните горния код, ще бъдете свързани с вашата пощенска кутия. Сега определено искате да видите съдържанието на входящата си кутия. Използвайте следната команда:

Пример-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 номер съдържа частта на тялото в обикновен текстов формат, частта на тялото в HTML формат и прикачените файлове на имейла. Да предположим, че искате да получите обикновен текст на частта от тялото на имейла, изпълнете следните SQL заявки:

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

Стойността 1 по-горе е MSG_NUMBER на съобщенията. Той ще ви даде следната информация:

  • PARTINDEX
  • PARENTINDEX
  • CONTENT_TYPE
  • SIZE и др.
PARTINDEX PARENTINDEX CONTENT_TYPE РАЗМЕР
0,0 0 текст/обикновен 2993
0,1 1 текст/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:Изтриване на имейл съобщение

По-долу е даден примерът за съхранена процедура за изтриване на имейл съобщението с помощта на 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;

Сега просто извикайте горната процедура, за да изтриете конкретно имейл съобщение, предадено като параметър. По-долу е примерът:

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

Свързани уроци:

  • Как да получа BLOB от файл в PL/SQL?
  • Oracle UTL_SMTP:Изпращане на поща с пример за прикачен файл с помощта на удостоверяване на 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. Oracle SQL подреждане по проблеми с подзаявката!

  2. как да декларирам %ROWTYPE на променлива, която е слабо въведен SYS_REFCURSOR?

  3. 2 начина за връщане на редове, които съдържат само буквено-цифрови знаци в Oracle

  4. GWFG в Oracle RAC

  5. програмна проверка за отворена връзка в JDBC