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