sql >> Databasteknik >  >> RDS >> Oracle

Hämta meddelanden från Mailbox med PL/SQL Mail_Client API

Nyligen fick jag uppdraget att bygga ett slags e-postklientsystem i Oracle Apex. Kravet var att visa meddelanden från e-postinkorgen på en sida för ett visst konto så att användaren kan se e-postmeddelanden, bilagor och radera meddelanden etc. Men i Oracle finns det paket för att skicka e-post med UTL_SMPT, UTL_MAIL , och APEX_MAIL, och det finns inget paket för att hämta e-postmeddelanden från brevlådan. Efter att ha letat lite hittade jag ett PL/SQL MAIL_CLIENT API skrivet av Carsten Czarski, med vilket du enkelt kan hämta meddelandena från brevlådan. Och i den här handledningen ger jag exemplen på MAIL_CLIENT API kommandon och procedurer. Hämta och installera först PL/SQL MAIL_CLIENT med följande länk:

Ladda ner PL/SQL MAIL_CLIENT API

PL/SQL MAIL_CLIENT API-exempel

I följande avsnitt ger jag steg-för-steg-exemplen för att ansluta med paketet MAIL_CLIENT, sedan hur man visar postlådeinnehåll, hur man visar ett visst meddelande och dess bilagor, etc.

Exempel-1:Anslut med MAIL_CLIENT

För att ansluta till e-postservern, använd följande PL/SQL-kod:

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

Ändra värdnamn, port, protokoll, användar-ID och lösenord enligt dina brevlådeinställningar. Och efter att ha kört ovanstående kod kommer du att kopplas till din brevlåda. Nu vill du definitivt se innehållet i din inkorg. Använd följande kommando:

Exempel-2:Visa brevlådans innehåll

För att se postlådans innehåll med PL/SQL MAIL_CLIENT API, kör följande SQL-sats för att se meddelandena som senast överst:

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

Du kommer att få följande kolumner från ovanstående fråga:

  • MSG_NUMBER
  • ÄMNE
  • SÄNDARE
  • SENDER_EMAIL
  • SENT_DATE
  • CONTENT_TYPE
  • RADERAT
  • Några fler flaggkolumner

Exempel-3:Hämta e-postmeddelandets struktur

Strukturen för ett e-postmeddelande innehåller informationen, till exempel vilken PARTINDEX nummer innehåller kroppsdelen i oformaterad text, kroppsdelen i HTML-format och e-postbilagor. Anta att du vill få den vanliga texten av e-postkroppsdelen, kör följande SQL-frågor:

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

Värdet 1 ovan är MSG_NUMBER av meddelandena. Det ger dig följande information:

  • PARTINDEX
  • PARENTINDEX
  • CONTENT_TYPE
  • STORLEK osv.
PARTINDEX PARENTINDEX CONTENT_TYPE STORLEK
0,0 0 text/oformaterad 2993
0,1 1 text/html 94849
1 1 flerpart/rapport 39398

Exempel-4:Hämta meddelandetexten

Om du till exempel vill få meddelandetexten i vanlig textformat för meddelande nummer 1, kör följande fråga:

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

Obs! 0,0 ovan är värdet på PARTINDEX-kolumnen för text/vanligt innehållstyp.

För att få brödtexten i HTML-format kör vi följande fråga med PARTINDEX kolumnvärde 0,1. Det kommer att returnera kroppen i CLOB :

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

Exempel-5:Hämta e-postbilagan

På samma sätt kan du hämta e-postbilagan med PARTINDEX värde 1 som parameter, som visas i frågan nedan:

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

Exempel-6:Ta bort ett e-postmeddelande

Nedan är exemplet på den lagrade proceduren för att radera e-postmeddelandet med 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;

Ring nu bara ovanstående procedur för att radera ett specifikt e-postmeddelande, skickat som parameter. Nedan är exemplet:

Begin
   Delete_Mail_Msg(3);
End;

Ovanstående uppmaning till proceduren DELETE_MAIL_MSG kommer att ta bort e-postmeddelande nummer 3 från servern.

Ge även exemplet nedan för att lagra alla inkorgsmeddelanden i en tabell med e-posttexten och bilagan. Följ dessa steg:

Steg-1:Skapa en tabell.

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

Steg-2:Skapa en Oracle PL/SQL lagrad procedur

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;

Kör proceduren ovan för att fylla tabellen med e-postmeddelanden enligt följande:

Begin
Load_Emails;
End;

Nu kan du fråga tabellen MAIL_INBOX för att visa e-postmeddelanden.

Select * from mail_inbox;
Ladda ner det här projektet från GitHub

Relaterade självstudier:

  • Hur får man BLOB från fil i PL/SQL?
  • Oracle UTL_SMTP:Skicka e-post med bilaga Exempel med Oracle Wallet-autentisering
  1. Hur man rundar tidsstämpel i MySQL

  2. SqlServer:Inloggning misslyckades för användaren

  3. Hur man kopierar en enorm tabelldata till en annan tabell i SQL Server

  4. Vad våra kunder förtjänar:Vi introducerar MariaDB Enterprise Documentation