Наскоро получих задачата да създам един вид система за пощенски клиент в Oracle Apex. Изискването беше да се показват съобщенията от входящата поща на страница за конкретен акаунт, така че потребителят да може да вижда имейл съобщенията, прикачените файлове и да изтрива съобщенията и т.н. Но в Oracle има пакети за изпращане на имейли чрез UTL_SMPT, UTL_MAIL , и APEX_MAIL и няма пакет за извличане на пощенските съобщения от пощенската кутия. След като потърсих малко, намерих PL/SQL MAIL_CLIENT API, написан от Карстен Чарски, с който лесно можете да извлечете съобщенията от пощенската кутия. И в този урок давам примери за MAIL_CLIENT API команди и процедури. Първо, изтеглете и инсталирайте PL/SQL MAIL_CLIENT като използвате следната връзка:
Изтеглете PL/SQL MAIL_CLIENT API
Примери за API на PL/SQL MAIL_CLIENT
В следващите раздели давам стъпка по стъпка примери за свързване с помощта на пакета MAIL_CLIENT, след това как да видите съдържанието на пощенската кутия, как да видите конкретно съобщение и неговите прикачени файлове и т.н.
Пример-1:Свържете се с помощта на MAIL_CLIENT
За да се свържете с пощенския сървър, използвайте следния 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; /
Променете името на хоста, порта, протокола, потребителския идентификатор и паролата според настройките на вашата пощенска кутия. И след като изпълните горния код, ще бъдете свързани с вашата пощенска кутия. Сега определено искате да видите съдържанието на входящата си кутия. Използвайте следната команда:
Пример-2:Преглед на съдържанието на пощенската кутия
За да видите съдържанието на пощенската кутия с помощта на PL/SQL MAIL_CLIENT API, изпълнете следния SQL оператор, за да видите най-новите съобщения отгоре:
select * from table(mail_client.get_mail_headers()) order by msg_number desc;
Ще получите следните колони от горната заявка:
- MSG_NUMBER
- ТЕМА
- ИЗПРАЩАТЕЛ
- SENDER_EMAIL
- SENT_DATE
- CONTENT_TYPE
- ИЗтрито
- Още няколко колони с флаг
Пример-3:Вземете структурата на пощенското съобщение
Структурата на имейл съобщението съдържа информацията, като например кой PARTINDEX номер съдържа частта на тялото в обикновен текстов формат, частта на тялото в HTML формат и прикачените файлове на имейла. Да предположим, че искате да получите обикновен текст на частта от тялото на имейла, изпълнете следните SQL заявки:
select * from table(mail_client.get_message(1).get_structure());
Стойността 1 по-горе е MSG_NUMBER на съобщенията. Той ще ви даде следната информация:
- PARTINDEX
- PARENTINDEX
- CONTENT_TYPE
- SIZE и др.
PARTINDEX | PARENTINDEX | CONTENT_TYPE | РАЗМЕР |
0,0 | 0 | текст/обикновен | 2993 |
0,1 | 1 | текст/html | 94849 |
1 | 1 | многочасти/отчет | 39398 |
Пример-4:Извличане на тялото на съобщението
Сега например, ако искате да получите тялото на съобщението в обикновен текстов формат за съобщение номер 1, изпълнете следната заявка:
SELECT Mail_Client.Get_Message(1 /* specify message number */).get_bodypart_content_varchar2('0,0') FROM Dual;
Забележка: 0,0 по-горе е стойността на колоната PARTINDEX за тип текст/обикновено съдържание.
За да получим тялото в HTML формат, ще изпълним следната заявка с PARTINDEX стойност на колоната 0,1. Тя ще върне тялото в CLOB :
SELECT Mail_Client.Get_Message(1 /* specify message number */).get_bodypart_content_clob('0,1') FROM Dual;
Пример-5:Вземете прикачения файл за поща
По същия начин вземете прикачения файл към пощата, като използвате PARTINDEX стойност 1 като параметър, както е показано в заявката по-долу:
SELECT Mail_Client.Get_Message(1 /* specify message number */).Get_Bodypart_Content_Blob('1') FROM Dual;
Пример-6:Изтриване на имейл съобщение
По-долу е даден примерът за съхранена процедура за изтриване на имейл съобщението с помощта на 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;
Сега просто извикайте горната процедура, за да изтриете конкретно имейл съобщение, предадено като параметър. По-долу е примерът:
Begin Delete_Mail_Msg(3); End;
Горното извикване на процедура DELETE_MAIL_MSG ще премахне имейл съобщението номер 3 от сървъра.
Също така, давайки примера по-долу за съхраняване на всички съобщения в пощенската кутия в таблица с тялото на пощата и прикачения файл. Следвайте тези стъпки:
Стъпка 1:Създайте таблица.
CREATE TABLE MAIL_INBOX ( MSG_NUMBER INTEGER, SUBJECT VARCHAR2(4000), SENT_DATE DATE, SENDER_EMAIL, BODY_TEXT CLOB, MAIL_ATTACHMENT BLOB) /
Стъпка 2:Създайте съхранена процедура на 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;
Изпълнете горната процедура, за да попълните таблицата с имейл съобщения, както следва:
Begin
Load_Emails;
End;
Сега можете да направите заявка за таблицата MAIL_INBOX за да видите имейл съобщенията.
Select * from mail_inbox;Изтеглете този проект от GitHub
Свързани уроци:
- Как да получа BLOB от файл в PL/SQL?
- Oracle UTL_SMTP:Изпращане на поща с пример за прикачен файл с помощта на удостоверяване на Oracle Wallet