sql >> Database >  >> RDS >> Oracle

Berichten ophalen uit mailbox met behulp van PL/SQL Mail_Client API

Onlangs kreeg ik de opdracht om een ​​soort mailclientsysteem te bouwen in Oracle Apex. De vereiste was om de berichten van e-mail Inbox op een pagina voor een bepaald account te tonen, zodat de gebruiker de e-mailberichten, bijlagen kan bekijken en de berichten kan verwijderen, enz. Maar in Oracle zijn er pakketten om e-mails te verzenden met UTL_SMPT, UTL_MAIL , en APEX_MAIL, en er is geen pakket om de e-mailberichten uit de mailbox op te halen. Na een beetje zoeken vond ik een PL/SQL MAIL_CLIENT API geschreven door Carsten Czarski, waarmee je de berichten gemakkelijk uit de mailbox kunt halen. En in deze tutorial geef ik de voorbeelden van MAIL_CLIENT API commando's en procedures. Download en installeer eerst PL/SQL MAIL_CLIENT via de volgende link:

PL/SQL MAIL_CLIENT API downloaden

PL/SQL MAIL_CLIENT API-voorbeelden

In de volgende secties geef ik de stapsgewijze voorbeelden om verbinding te maken met behulp van het MAIL_CLIENT-pakket, vervolgens hoe de inhoud van de mailbox te bekijken, hoe een bepaald bericht en de bijlagen te bekijken, enz.

Voorbeeld-1:verbinding maken via MAIL_CLIENT

Gebruik de volgende PL/SQL-code om verbinding te maken met de mailserver:

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

Wijzig de hostnaam, poort, protocol, gebruikers-ID en wachtwoord volgens uw mailboxinstellingen. En na het uitvoeren van de bovenstaande code wordt u verbonden met uw mailbox. Nu wil je zeker de inhoud van je inbox bekijken. Gebruik het volgende commando:

Voorbeeld-2:de inhoud van de mailbox bekijken

Om de inhoud van de mailbox te bekijken met behulp van de PL/SQL MAIL_CLIENT API, voert u de volgende SQL-instructie uit om de laatste berichten bovenaan te zien:

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

U krijgt de volgende kolommen uit de bovenstaande zoekopdracht:

  • MSG_NUMBER
  • ONDERWERP
  • AFZENDER
  • SENDER_EMAIL
  • SENT_DATE
  • CONTENT_TYPE
  • VERWIJDERD
  • Nog wat vlaggenkolommen

Voorbeeld-3:de structuur van het e-mailbericht ophalen

De structuur van een e-mailbericht bevat de informatie, zoals welke PARTINDEX nummer bevat het lichaamsdeel in platte tekstformaat, het lichaamsdeel in HTML-formaat en de bijlagen van de e-mail. Stel dat u de platte tekst van het hoofdgedeelte van de e-mail wilt krijgen, voer de volgende SQL-query's uit:

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

De waarde 1 hierboven is de MSG_NUMBER van de berichten. Het geeft je de volgende informatie:

  • PARTINDEX
  • OUDERINDEX
  • CONTENT_TYPE
  • GROOTTE, enz.
PARTINDEX PARENTINDEX CONTENT_TYPE MAAT
0,0 0 tekst/plat 2993
0,1 1 tekst/html 94849
1 1 multipart/rapport 39398

Voorbeeld 4:Haal de berichttekst op

Als u nu bijvoorbeeld de berichttekst in platte tekstindeling voor berichtnummer 1 wilt krijgen, voert u de volgende query uit:

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

Opmerking: De 0,0 hierboven is de waarde van de PARTINDEX-kolom voor tekst/platte inhoud.

Om de body in HTML-formaat te krijgen, zullen we de volgende query uitvoeren met de PARTINDEX kolomwaarde 0,1. Het zal het lichaam teruggeven in CLOB :

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

Voorbeeld 5:de e-mailbijlage ophalen

Op dezelfde manier haalt u de e-mailbijlage op met behulp van de PARTINDEX waarde 1 als parameter, zoals weergegeven in de onderstaande vraag:

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

Voorbeeld-6:een e-mailbericht verwijderen

Hieronder ziet u het voorbeeld van de opgeslagen procedure om het e-mailbericht te verwijderen met behulp van de 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;

Roep nu de bovenstaande procedure aan om een ​​specifiek e-mailbericht, doorgegeven als parameter, te verwijderen. Hieronder is het voorbeeld:

Begin
   Delete_Mail_Msg(3);
End;

De bovenstaande oproep tot procedure DELETE_MAIL_MSG zal het e-mailbericht nummer 3 van de server verwijderen.

Geef ook het onderstaande voorbeeld om alle inbox-berichten op te slaan in een tabel met de hoofdtekst en bijlage van de e-mail. Volg deze stappen:

Stap-1:maak een tabel.

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

Stap-2:Maak een Oracle PL/SQL Stored Procedure

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;

Voer de bovenstaande procedure uit om de tabel als volgt te vullen met e-mailberichten:

Begin
Load_Emails;
End;

Nu kunt u de tabel MAIL_INBOX . doorzoeken om de e-mailberichten te bekijken.

Select * from mail_inbox;
Download dit project van GitHub

Verwante tutorials:

  • Hoe haal ik BLOB uit een bestand in PL/SQL?
  • Oracle UTL_SMTP:voorbeeld van e-mail met bijlage verzenden met Oracle Wallet-verificatie
  1. Programmatisch opgeslagen SQL Server-procedurebron ophalen die identiek is aan de bron die wordt geretourneerd door de SQL Server Management Studio-gui?

  2. JDBC ResultSet krijg kolommen met tabelalias

  3. MS Access tot Oracle eenvoudige conversie / migratie

  4. Database-e-mailberichten verwijderen uit de msdb-database in SQL Server (T-SQL)