Oracle
 sql >> Database >  >> RDS >> Oracle

Recupera i messaggi dalla cassetta postale utilizzando l'API Mail_Client PL/SQL

Recentemente ho avuto il compito di creare una sorta di sistema client di posta in Oracle Apex. Il requisito era mostrare i messaggi di posta in arrivo su una pagina per un determinato account in modo che l'utente possa visualizzare i messaggi di posta elettronica, gli allegati e possa eliminare i messaggi, ecc. Ma in Oracle ci sono pacchetti per inviare e-mail utilizzando UTL_SMPT, UTL_MAIL e APEX_MAIL e non esiste alcun pacchetto per recuperare i messaggi di posta dalla cassetta postale. Dopo aver cercato un po', ho trovato un'API MAIL_CLIENT PL/SQL scritta da Carsten Czarski, con la quale puoi facilmente recuperare i messaggi dalla casella di posta. E in questo tutorial, fornisco gli esempi di API MAIL_CLIENT comandi e procedure. Innanzitutto, scarica e installa PL/SQL MAIL_CLIENT utilizzando il seguente link:

Scarica PL/SQL MAIL_CLIENT API

Esempi di API MAIL_CLIENT PL/SQL

Nelle sezioni seguenti, fornirò degli esempi passo passo per connettersi utilizzando il pacchetto MAIL_CLIENT, quindi come visualizzare il contenuto della casella di posta, come visualizzare un particolare messaggio e i suoi allegati, ecc.

Esempio-1:connessione tramite MAIL_CLIENT

Per connettersi al server di posta, utilizzare il seguente codice 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;
/

Modifica il nome host, la porta, il protocollo, l'ID utente e la password in base alle impostazioni della tua casella di posta. E dopo aver eseguito il codice sopra, sarai connesso alla tua casella di posta. Ora vuoi assolutamente visualizzare il contenuto della tua casella di posta. Usa il seguente comando:

Esempio-2:Visualizza il contenuto della casella di posta

Per visualizzare il contenuto della cassetta postale utilizzando l'API PL/SQL MAIL_CLIENT, eseguire la seguente istruzione SQL per visualizzare i messaggi più recenti in primo piano:

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

Otterrai le seguenti colonne dalla query precedente:

  • NUMERO_MSG
  • SOGGETTO
  • MITTENTE
  • SENDER_EMAIL
  • DATA_INVIO
  • TIPO_CONTENT
  • ELIMINATO
  • Altre colonne di segnalazione

Esempio-3:Ottieni la struttura del messaggio di posta

La struttura di un messaggio di posta contiene le informazioni, ad esempio quale PARTINDEX number contiene la parte del corpo in formato testo normale, la parte del corpo in formato HTML e gli allegati della posta. Supponiamo di voler ottenere il testo normale della parte del corpo dell'e-mail eseguendo le seguenti query SQL:

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

Il valore 1 sopra è il MSG_NUMBER dei messaggi. Ti darà le seguenti informazioni:

  • PARTINDICE
  • INDICE GENITORI
  • TIPO_CONTENT
  • TAGLIA, ecc.
PARTINDEX INDICE GENITORI CONTENT_TYPE TAGLIA
0,0 0 testo/semplice 2993
0,1 1 testo/html 94849
1 1 multiparte/rapporto 39398

Esempio-4:recuperare il corpo del messaggio

Ora, ad esempio, se vuoi ottenere il corpo del messaggio in formato testo normale per il messaggio numero 1, esegui la seguente query:

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

Nota: Lo 0,0 sopra è il valore della colonna PARTINDEX per il tipo di contenuto testo/normale.

Per ottenere il corpo in formato HTML, eseguiremo la seguente query con PARTINDEX valore della colonna 0,1. Restituirà il corpo in CLOB :

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

Esempio-5:ottieni l'allegato di posta

Allo stesso modo, ottieni l'allegato di posta utilizzando il PARTINDEX valore 1 come parametro, come mostrato nella query seguente:

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

Esempio-6:eliminare un messaggio di posta

Di seguito è riportato l'esempio di stored procedure per eliminare il messaggio di posta, utilizzando l'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;

Ora basta chiamare la procedura sopra per eliminare un messaggio di posta specifico, passato come parametro. Di seguito è riportato l'esempio:

Begin
   Delete_Mail_Msg(3);
End;

La precedente chiamata alla procedura DELETE_MAIL_MSG rimuoverà il messaggio di posta elettronica numero 3 dal server.

Inoltre, fornendo l'esempio seguente per archiviare tutti i messaggi di posta in arrivo in una tabella con il corpo della posta e l'allegato. Segui questi passaggi:

Fase-1:crea una tabella.

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

Fase-2:creazione di una stored procedure 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;

Eseguire la procedura precedente per popolare la tabella con i messaggi di posta elettronica come segue:

Begin
Load_Emails;
End;

Ora puoi interrogare la tabella MAIL_INBOX per visualizzare i messaggi di posta elettronica.

Select * from mail_inbox;
Scarica questo progetto da GitHub

Esercitazioni correlate:

  • Come ottenere BLOB da file in PL/SQL?
  • Oracle UTL_SMTP:esempio di invio di posta con allegato utilizzando l'autenticazione di Oracle Wallet