Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Pobieranie wiadomości ze skrzynki pocztowej za pomocą interfejsu API Mail_Client PL/SQL

Niedawno dostałem zadanie zbudowania swego rodzaju systemu klienta pocztowego w Oracle Apex. Wymaganiem było pokazanie wiadomości skrzynki odbiorczej poczty na stronie dla konkretnego konta, aby użytkownik mógł przeglądać wiadomości e-mail, załączniki i usuwać wiadomości itp. Ale w Oracle istnieją pakiety do wysyłania wiadomości e-mail za pomocą UTL_SMPT, UTL_MAIL i APEX_MAIL i nie ma pakietu do pobierania wiadomości e-mail ze skrzynki pocztowej. Po krótkich poszukiwaniach znalazłem API PL/SQL MAIL_CLIENT napisane przez Carstena Czarskiego, za pomocą którego można łatwo pobierać wiadomości ze skrzynki pocztowej. W tym samouczku podaję przykłady MAIL_CLIENT API polecenia i procedury. Najpierw pobierz i zainstaluj PL/SQL MAIL_CLIENT korzystając z następującego linku:

Pobierz PL/SQL MAIL_CLIENT API

Przykłady API PL/SQL MAIL_CLIENT

W kolejnych sekcjach podam przykłady krok po kroku, jak połączyć się za pomocą pakietu MAIL_CLIENT, a następnie jak wyświetlić zawartość skrzynki pocztowej, jak wyświetlić konkretną wiadomość i jej załączniki itp.

Przykład 1:Połącz za pomocą MAIL_CLIENT

Aby połączyć się z serwerem pocztowym, użyj następującego kodu 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;
/

Zmień nazwę hosta, port, protokół, identyfikator użytkownika i hasło zgodnie z ustawieniami skrzynki pocztowej. A po wykonaniu powyższego kodu zostaniesz połączony ze swoją skrzynką pocztową. Teraz zdecydowanie chcesz przejrzeć zawartość swojej skrzynki odbiorczej. Użyj następującego polecenia:

Przykład 2:Wyświetl zawartość skrzynki pocztowej

Aby wyświetlić zawartość skrzynki pocztowej za pomocą interfejsu API PL/SQL MAIL_CLIENT, uruchom następującą instrukcję SQL, aby wyświetlić najnowsze wiadomości:

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

Otrzymasz następujące kolumny z powyższego zapytania:

  • MSG_NUMBER
  • TEMAT
  • NADAWCA
  • SENDER_EMAIL
  • SENT_DATE
  • CONTENT_TYPE
  • USUNIĘTE
  • Więcej kolumn z flagami

Przykład 3:Pobierz strukturę wiadomości pocztowej

Struktura wiadomości e-mail zawiera informacje, takie jak PARTINDEX number zawiera część treści w formacie zwykłego tekstu, część treści w formacie HTML oraz załączniki do wiadomości e-mail. Załóżmy, że chcesz uzyskać zwykły tekst części treści wiadomości e-mail, uruchom następujące zapytania SQL:

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

Wartość 1 powyżej to MSG_NUMBER wiadomości. Otrzymasz następujące informacje:

  • INDEKS CZĘŚCI
  • INDEKS RODZICIELSKI
  • CONTENT_TYPE
  • ROZMIAR itp.
PARTINDEX PARENTINDEX CONTENT_TYPE ROZMIAR
0,0 0 tekst/zwykły 2993
0,1 1 tekst/html 94849
1 1 wieloczęściowy/raport 39398

Przykład 4:Pobierz treść wiadomości

Teraz na przykład, jeśli chcesz uzyskać treść wiadomości w formacie zwykłego tekstu dla wiadomości numer 1, uruchom następujące zapytanie:

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

Uwaga: Powyższe 0,0 to wartość kolumny PARTINDEX dla typu treści tekst/zwykły.

Aby uzyskać treść w formacie HTML, uruchomimy następujące zapytanie z PARTINDEX wartość kolumny 0,1. Zwróci ciało w CLOB :

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

Przykład 5:pobierz załącznik do poczty

Podobnie pobierz załącznik do wiadomości za pomocą PARTINDEX wartość 1 jako parametr, jak pokazano w poniższym zapytaniu:

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

Przykład 6:Usuń wiadomość pocztową

Poniżej znajduje się przykład procedury składowanej służącej do usuwania wiadomości e-mail przy użyciu interfejsu 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;

Teraz wystarczy wywołać powyższą procedurę, aby usunąć określoną wiadomość e-mail, przekazaną jako parametr. Poniżej znajduje się przykład:

Begin
   Delete_Mail_Msg(3);
End;

Powyższe wezwanie do procedury DELETE_MAIL_MSG usunie wiadomość e-mail nr 3 z serwera.

Ponadto podajemy poniższy przykład, aby przechowywać wszystkie wiadomości ze skrzynki odbiorczej w tabeli z treścią wiadomości i załącznikiem. Wykonaj następujące kroki:

Krok 1:Utwórz tabelę.

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

Krok 2:Utwórz procedurę składowaną 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;

Uruchom powyższą procedurę, aby wypełnić tabelę wiadomościami e-mail w następujący sposób:

Begin
Load_Emails;
End;

Teraz możesz wysłać zapytanie do tabeli MAIL_INBOX aby wyświetlić wiadomości e-mail.

Select * from mail_inbox;
Pobierz ten projekt z GitHub

Powiązane samouczki:

  • Jak pobrać BLOB z pliku w PL/SQL?
  • Oracle UTL_SMTP:przykład wysyłania poczty z załącznikiem przy użyciu uwierzytelniania portfela Oracle
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tabela XML z Oracle 11g

  2. Lista zadań

  3. Nieprawidłowa nazwa wspólnego użytkownika lub roli

  4. przykłady składni sprzężenia oracle

  5. Jak rozwiązać ORA-00900