Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Abrufen von Nachrichten aus dem Postfach mithilfe der PL/SQL Mail_Client-API

Kürzlich bekam ich die Aufgabe, eine Art Mail-Client-System in Oracle Apex zu bauen. Die Anforderung bestand darin, die Nachrichten des Posteingangs auf einer Seite für ein bestimmtes Konto anzuzeigen, damit der Benutzer die E-Mail-Nachrichten, Anhänge anzeigen und die Nachrichten usw. löschen kann. Aber in Oracle gibt es Pakete zum Senden von E-Mails mit UTL_SMPT, UTL_MAIL und APEX_MAIL, und es gibt kein Paket zum Abrufen der E-Mail-Nachrichten aus dem Postfach. Nach ein wenig Recherche habe ich eine von Carsten Czarski geschriebene PL/SQL MAIL_CLIENT API gefunden, mit der man ganz einfach die Nachrichten aus dem Postfach abrufen kann. Und in diesem Tutorial gebe ich Beispiele für die MAIL_CLIENT API Befehle und Verfahren. Laden Sie zuerst PL/SQL MAIL_CLIENT herunter und installieren Sie es unter folgendem Link:

Laden Sie die PL/SQL MAIL_CLIENT-API herunter

PL/SQL MAIL_CLIENT-API-Beispiele

In den folgenden Abschnitten gebe ich Schritt-für-Schritt-Beispiele für die Verbindung mit dem MAIL_CLIENT-Paket, dann für das Anzeigen von Mailbox-Inhalten, das Anzeigen einer bestimmten Nachricht und ihrer Anhänge usw.

Beispiel-1:Verbindung mit MAIL_CLIENT herstellen

Um eine Verbindung zum Mailserver herzustellen, verwenden Sie den folgenden PL/SQL-Code:

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

Ändern Sie den Hostnamen, den Port, das Protokoll, die Benutzer-ID und das Kennwort gemäß Ihren Postfacheinstellungen. Und nachdem Sie den obigen Code ausgeführt haben, werden Sie mit Ihrer Mailbox verbunden. Jetzt möchten Sie auf jeden Fall den Inhalt Ihres Posteingangs anzeigen. Verwenden Sie den folgenden Befehl:

Beispiel-2:Anzeigen des Postfachinhalts

Um den Postfachinhalt mit der PL/SQL MAIL_CLIENT-API anzuzeigen, führen Sie die folgende SQL-Anweisung aus, um die neuesten Nachrichten ganz oben anzuzeigen:

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

Sie erhalten die folgenden Spalten aus der obigen Abfrage:

  • MSG_NUMBER
  • BETREFF
  • ABSENDER
  • SENDER_EMAIL
  • SENT_DATE
  • CONTENT_TYPE
  • GELÖSCHT
  • Einige weitere Flag-Spalten

Beispiel-3:Holen Sie sich die Struktur der E-Mail-Nachricht

Die Struktur einer E-Mail-Nachricht enthält die Informationen, z. B. welche PARTINDEX number enthält den Body-Teil im Nur-Text-Format, den Body-Teil im HTML-Format und die Anhänge der Mail. Angenommen, Sie möchten den Klartext des E-Mail-Textteils abrufen, indem Sie die folgenden SQL-Abfragen ausführen:

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

Der Wert 1 oben ist die MSG_NUMBER der Nachrichten. Sie erhalten folgende Informationen:

  • PARTINDEX
  • PARENTINDEX
  • CONTENT_TYPE
  • GRÖSSE usw.
PARTINDEX PARENTINDEX CONTENT_TYPE GRÖSSE
0,0 0 Text/Normal 2993
0,1 1 text/html 94849
1 1 mehrteilig/Bericht 39398

Beispiel-4:Nachrichtentext abrufen

Wenn Sie nun beispielsweise den Nachrichtentext für Nachricht Nummer 1 im Nur-Text-Format erhalten möchten, führen Sie die folgende Abfrage aus:

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

Hinweis: Die obige 0,0 ist der Wert der PARTINDEX-Spalte für den Inhaltstyp text/plain.

Um den Text im HTML-Format zu erhalten, führen wir die folgende Abfrage mit dem PARTINDEX aus Spaltenwert 0,1. Der Körper wird in CLOB zurückgegeben :

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

Example-5:E-Mail-Anhang abrufen

Rufen Sie auf ähnliche Weise den E-Mail-Anhang mit dem PARTINDEX ab Wert 1 als Parameter, wie in der folgenden Abfrage gezeigt:

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

Beispiel-6:E-Mail-Nachricht löschen

Unten sehen Sie das Beispiel einer gespeicherten Prozedur zum Löschen der E-Mail-Nachricht mithilfe der 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;

Rufen Sie jetzt einfach die obige Prozedur auf, um eine bestimmte als Parameter übergebene E-Mail-Nachricht zu löschen. Unten ist das Beispiel:

Begin
   Delete_Mail_Msg(3);
End;

Der obige Aufruf der Prozedur DELETE_MAIL_MSG entfernt die E-Mail-Nachricht Nummer 3 vom Server.

Geben Sie auch das folgende Beispiel an, um alle Posteingangsnachrichten mit dem E-Mail-Text und dem Anhang in einer Tabelle zu speichern. Befolgen Sie diese Schritte:

Schritt-1:Erstellen Sie eine Tabelle.

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

Schritt-2:Erstellen Sie eine gespeicherte Oracle PL/SQL-Prozedur

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;

Führen Sie das obige Verfahren aus, um die Tabelle wie folgt mit E-Mail-Nachrichten zu füllen:

Begin
Load_Emails;
End;

Jetzt können Sie die Tabelle MAIL_INBOX abfragen um die E-Mail-Nachrichten anzuzeigen.

Select * from mail_inbox;
Laden Sie dieses Projekt von GitHub herunter

Verwandte Tutorials:

  • Wie erhalte ich BLOB aus einer Datei in PL/SQL?
  • Oracle UTL_SMTP:Beispiel für E-Mail-Versand mit Anhang unter Verwendung der Oracle Wallet-Authentifizierung