Oracle
 sql >> Base de données >  >> RDS >> Oracle

Récupérer les messages de la boîte aux lettres à l'aide de l'API PL/SQL Mail_Client

Récemment, j'ai eu la tâche de créer une sorte de système client de messagerie dans Oracle Apex. L'exigence était d'afficher les messages de la boîte de réception sur une page pour un compte particulier afin que l'utilisateur puisse afficher les messages électroniques, les pièces jointes et supprimer les messages, etc. Mais dans Oracle, il existe des packages pour envoyer des e-mails en utilisant UTL_SMPT, UTL_MAIL , et APEX_MAIL, et il n'y a pas de package pour récupérer les messages électroniques de la boîte aux lettres. Après avoir cherché un peu, j'ai trouvé une API PL/SQL MAIL_CLIENT écrite par Carsten Czarski, avec laquelle vous pouvez facilement récupérer les messages de la boîte aux lettres. Et dans ce tutoriel, je donne des exemples d'API MAIL_CLIENT commandes et procédures. Tout d'abord, téléchargez et installez PL/SQL MAIL_CLIENT en utilisant le lien suivant :

Télécharger l'API PL/SQL MAIL_CLIENT

Exemples d'API PL/SQL MAIL_CLIENT

Dans les sections suivantes, je donne des exemples étape par étape pour se connecter à l'aide du package MAIL_CLIENT, puis comment afficher le contenu de la boîte aux lettres, comment afficher un message particulier et ses pièces jointes, etc.

Exemple-1 :Se connecter à l'aide de MAIL_CLIENT

Pour vous connecter au serveur de messagerie, utilisez le code PL/SQL suivant :

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

Modifiez le nom d'hôte, le port, le protocole, l'ID utilisateur et le mot de passe en fonction des paramètres de votre boîte aux lettres. Et après avoir exécuté le code ci-dessus, vous serez connecté à votre boîte aux lettres. Maintenant, vous voulez certainement voir le contenu de votre boîte de réception. Utilisez la commande suivante :

Exemple 2 :afficher le contenu de la boîte aux lettres

Pour afficher le contenu de la boîte aux lettres à l'aide de l'API PL/SQL MAIL_CLIENT, exécutez l'instruction SQL suivante pour afficher les derniers messages en premier :

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

Vous obtiendrez les colonnes suivantes à partir de la requête ci-dessus :

  • MSG_NUMBER
  • OBJET
  • EXPEDITEUR
  • SENDER_EMAIL
  • SENT_DATE
  • CONTENT_TYPE
  • SUPPRIMÉ
  • D'autres colonnes de drapeaux

Exemple 3 :obtenir la structure du message électronique

La structure d'un message électronique contient les informations, telles que PARTINDEX number contient la partie du corps au format texte brut, la partie du corps au format HTML et les pièces jointes de l'e-mail. Supposons que vous souhaitiez obtenir le texte brut de la partie du corps de l'e-mail en exécutant les requêtes SQL suivantes :

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

La valeur 1 ci-dessus est le MSG_NUMBER des messages. Il vous donnera les informations suivantes :

  • PARTINDEX
  • INDICE PARENTAL
  • CONTENT_TYPE
  • TAILLE, etc.
PARTINDEX INDICE PARENTAL CONTENT_TYPE TAILLE
0,0 0 texte/brut 2993
0,1 1 texte/html 94849
1 1 multipart/rapport 39398

Exemple 4 :Récupérer le corps du message

Maintenant, par exemple, si vous souhaitez obtenir le corps du message au format texte brut pour le message numéro 1, exécutez la requête suivante :

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

Remarque : Le 0,0 ci-dessus est la valeur de la colonne PARTINDEX pour le type de contenu text/plain.

Pour obtenir le corps au format HTML, nous allons exécuter la requête suivante avec le PARTINDEX valeur de colonne 0,1. Il renverra le corps dans CLOB :

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

Exemple-5 :Obtenir la pièce jointe

De même, récupérez la pièce jointe à l'aide du PARTINDEX valeur 1 comme paramètre, comme indiqué dans la requête ci-dessous :

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

Exemple 6 :Supprimer un message électronique

Vous trouverez ci-dessous l'exemple de procédure stockée pour supprimer le message électronique, à l'aide de 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;

Maintenant, appelez simplement la procédure ci-dessus pour supprimer un message électronique spécifique, passé en paramètre. Ci-dessous l'exemple :

Begin
   Delete_Mail_Msg(3);
End;

L'appel ci-dessus à la procédure DELETE_MAIL_MSG supprimera le message électronique numéro 3 du serveur.

En outre, en donnant l'exemple ci-dessous pour stocker tous les messages de la boîte de réception dans une table avec le corps du courrier et la pièce jointe. Suivez ces étapes :

Étape 1 :Créer un tableau.

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

Étape 2 :Créer une procédure stockée 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;

Exécutez la procédure ci-dessus pour remplir le tableau avec les e-mails comme suit :

Begin
Load_Emails;
End;

Vous pouvez maintenant interroger la table MAIL_INBOX pour afficher les e-mails.

Select * from mail_inbox;
Téléchargez ce projet depuis GitHub

Tutoriels associés :

  • Comment obtenir un BLOB à partir d'un fichier en PL/SQL ?
  • Oracle UTL_SMTP :Exemple d'envoi de courrier avec pièce jointe à l'aide d'Oracle Wallet Authentication