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