sql >> Databáze >  >> RDS >> Oracle

Načítání zpráv z poštovní schránky pomocí PL/SQL Mail_Client API

Nedávno jsem dostal za úkol vybudovat jakýsi poštovní klientský systém v Oracle Apex. Požadavkem bylo zobrazit zprávy ve složce Doručená pošta na stránce pro konkrétní účet, aby si uživatel mohl prohlížet e-mailové zprávy, přílohy a mohl zprávy mazat atd. V Oracle však existují balíčky pro odesílání e-mailů pomocí UTL_SMPT, UTL_MAIL a APEX_MAIL a neexistuje žádný balíček pro načtení e-mailových zpráv z poštovní schránky. Po troše hledání jsem našel PL/SQL MAIL_CLIENT API napsané Carstenem Czarskim, pomocí kterého můžete snadno získávat zprávy z poštovní schránky. A v tomto tutoriálu uvádím příklady MAIL_CLIENT API příkazy a procedury. Nejprve si stáhněte a nainstalujte PL/SQL MAIL_CLIENT pomocí následujícího odkazu:

Stáhněte si PL/SQL MAIL_CLIENT API

Příklady API MAIL_CLIENT PL/SQL

V následujících sekcích uvedu krok za krokem příklady připojení pomocí balíčku MAIL_CLIENT, poté, jak zobrazit obsah poštovní schránky, jak zobrazit konkrétní zprávu a její přílohy atd.

Příklad-1:Připojení pomocí MAIL_CLIENT

Pro připojení k poštovnímu serveru použijte následující kód 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;
/

Změňte název hostitele, port, protokol, ID uživatele a heslo podle nastavení vaší poštovní schránky. A po provedení výše uvedeného kódu budete připojeni k vaší poštovní schránce. Nyní si určitě chcete prohlédnout obsah své doručené pošty. Použijte následující příkaz:

Příklad 2:Zobrazení obsahu poštovní schránky

Chcete-li zobrazit obsah poštovní schránky pomocí PL/SQL MAIL_CLIENT API, spusťte následující příkaz SQL pro zobrazení nejnovějších zpráv:

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

Z výše uvedeného dotazu získáte následující sloupce:

  • MSG_NUMBER
  • PŘEDMĚT
  • ODESÍLATEL
  • SENDER_EMAIL
  • SENT_DATE
  • TYP OBSAHU
  • SMAŽENO
  • Několik dalších sloupců s vlajkami

Příklad 3:Získejte strukturu poštovní zprávy

Struktura e-mailové zprávy obsahuje informace, jako například který PARTINDEX číslo obsahuje část těla ve formátu prostého textu, část těla ve formátu HTML a přílohy e-mailu. Předpokládejme, že chcete, aby prostý text části těla e-mailu spustil následující SQL dotazy:

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

Hodnota 1 výše je MSG_NUMBER ze zpráv. Poskytne vám následující informace:

  • PARTINDEX
  • PARENTINDEX
  • TYP OBSAHU
  • VELIKOST atd.
PARTINDEX PARENTINDEX CONTENT_TYPE VELIKOST
0,0 0 text/prostý 2993
0,1 1 text/html 94849
1 1 vícedílný/přehled 39398

Příklad 4:Načtení těla zprávy

Nyní například, pokud chcete získat tělo zprávy ve formátu prostého textu pro zprávu číslo 1, spusťte následující dotaz:

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

Poznámka: 0,0 výše je hodnota sloupce PARTINDEX pro textový/prostý typ obsahu.

Chcete-li získat tělo ve formátu HTML, spustíme následující dotaz s PARTINDEX hodnota sloupce 0,1. Vrátí tělo v CLOB :

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

Příklad 5:Získejte přílohu pošty

Podobně získáte přílohu pošty pomocí PARTINDEX hodnotu 1 jako parametr, jak je uvedeno v níže uvedeném dotazu:

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

Příklad 6:Smazání poštovní zprávy

Níže je uveden příklad uložené procedury pro odstranění e-mailové zprávy pomocí MAIL_CLIENT API.

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;

Nyní stačí zavolat výše uvedený postup k odstranění konkrétní e-mailové zprávy, předané jako parametr. Níže je příklad:

Begin
   Delete_Mail_Msg(3);
End;

Výše uvedené volání procedury DELETE_MAIL_MSG odstraní e-mailovou zprávu číslo 3 ze serveru.

Níže uvedený příklad také ukládá všechny zprávy doručené pošty do tabulky s tělem pošty a přílohou. Postupujte takto:

Krok-1:Vytvořte tabulku.

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

Krok-2:Vytvořte uloženou proceduru 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;

Spusťte výše uvedený postup k naplnění tabulky e-mailovými zprávami následovně:

Begin
Load_Emails;
End;

Nyní můžete dotazovat tabulku MAIL_INBOX pro zobrazení e-mailových zpráv.

Select * from mail_inbox;
Stáhněte si tento projekt z GitHubu

Související výukové programy:

  • Jak získat BLOB ze souboru v PL/SQL?
  • Oracle UTL_SMTP:Příklad odeslání pošty s přílohou pomocí ověřování Oracle Wallet
  1. Oracle Pro*C/OCI instalační obslužné programy pro SIGSEGV/SIGABRT a přátele – proč a jak je deaktivovat?

  2. Jak používat příkaz IF/ELSE k aktualizaci nebo vytvoření nové položky uzlu xml v SQL

  3. Jak sečíst hodnoty sloupce v SQL?

  4. Riziko při používání dynamické paměti v rámci Hyper-V