Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Recuperar mensagens da caixa de correio usando a API PL/SQL Mail_Client


Recentemente recebi a tarefa de construir uma espécie de sistema cliente de e-mail no Oracle Apex. O requisito era mostrar as mensagens da caixa de entrada de e-mail em uma página para uma determinada conta para que o usuário pudesse visualizar as mensagens de e-mail, anexos e poder deletar as mensagens, etc. Mas no Oracle, existem pacotes para enviar e-mails usando UTL_SMPT, UTL_MAIL , e APEX_MAIL, e não há pacote para recuperar as mensagens de correio da caixa de correio. Depois de pesquisar um pouco, encontrei uma API PL/SQL MAIL_CLIENT escrita por Carsten Czarski, com a qual você pode recuperar facilmente as mensagens da caixa de correio. E neste tutorial, estou dando os exemplos da MAIL_CLIENT API comandos e procedimentos. Primeiro, baixe e instale o PL/SQL MAIL_CLIENT usando o seguinte link:

Baixe a API PL/SQL MAIL_CLIENT

Exemplos de API PL/SQL MAIL_CLIENT


Nas seções a seguir, estou dando os exemplos passo a passo para conectar usando o pacote MAIL_CLIENT, como visualizar o conteúdo da caixa de correio, como visualizar uma mensagem específica e seus anexos, etc.

Exemplo-1:conectar usando MAIL_CLIENT


Para se conectar ao servidor de correio, use o seguinte código 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;
/

Altere o nome do host, porta, protocolo, ID de usuário e senha de acordo com as configurações de sua caixa de correio. E depois de executar o código acima você estará conectado à sua caixa de correio. Agora definitivamente você quer ver o conteúdo da sua caixa de entrada. Use o seguinte comando:

Exemplo-2:visualizar o conteúdo da caixa de correio


Para visualizar o conteúdo da caixa de correio usando a API PL/SQL MAIL_CLIENT, execute a seguinte instrução SQL para visualizar as mensagens mais recentes na parte superior:
select * from table(mail_client.get_mail_headers()) order by msg_number desc;

Você obterá as seguintes colunas da consulta acima:
  • MSG_NUMBER
  • ASSUNTO
  • REMETENTE
  • SENDER_EMAIL
  • SENT_DATE
  • CONTENT_TYPE
  • EXCLUÍDO
  • Mais algumas colunas de sinalização

Exemplo-3:obter a estrutura da mensagem de correio


A estrutura de uma mensagem de e-mail contém as informações, como qual PARTINDEX number contém a parte do corpo em formato de texto simples, a parte do corpo em formato HTML e os anexos do email. Suponha que você queira que o texto simples da parte do corpo do email execute as seguintes consultas SQL:
select * from table(mail_client.get_message(1).get_structure());

O valor 1 acima é o MSG_NUMBER das mensagens. Ele lhe dará as seguintes informações:
  • PARTINDEX
  • PARENTINDEX
  • CONTENT_TYPE
  • TAMANHO etc.
PARTINDEX PARENTINDEX CONTENT_TYPE TAMANHO
0,0 0 texto/simples 2993
0,1 1 texto/html 94849
1 1 multipartes/relatório 39398

Exemplo-4:recuperar o corpo da mensagem


Agora, por exemplo, se você deseja obter o corpo da mensagem em formato de texto simples para a mensagem número 1, execute a seguinte consulta:
SELECT Mail_Client.Get_Message(1 /* specify message number */).get_bodypart_content_varchar2('0,0')
             FROM Dual;

Observação: O 0,0 acima é o valor da coluna PARTINDEX para o tipo de conteúdo text/plain.

Para obter o corpo no formato HTML, executaremos a seguinte consulta com o PARTINDEX valor da coluna 0,1. Ele retornará o corpo em CLOB :
SELECT Mail_Client.Get_Message(1 /* specify message number */).get_bodypart_content_clob('0,1')
            FROM Dual;

Exemplo-5:obtenha o anexo de e-mail


Da mesma forma, obtenha o anexo de e-mail usando o PARTINDEX valor 1 como parâmetro, conforme mostrado na consulta abaixo:
SELECT Mail_Client.Get_Message(1 /* specify message number */).Get_Bodypart_Content_Blob('1')
             FROM Dual;

Exemplo-6:Excluir uma mensagem de e-mail


Abaixo está o exemplo de procedimento armazenado para excluir a mensagem de email, usando a 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;

Agora é só chamar o procedimento acima para deletar uma mensagem de email específica, passada como parâmetro. Abaixo segue o exemplo:
Begin
   Delete_Mail_Msg(3);
End;

A chamada acima para o procedimento DELETE_MAIL_MSG irá remover a mensagem de e-mail número 3 do servidor.

Além disso, dando o exemplo abaixo para armazenar todas as mensagens da caixa de entrada em uma tabela com o corpo do email e o anexo. Siga esses passos:

Etapa 1:crie uma tabela.

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

Etapa 2:criar um procedimento armazenado 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;

Execute o procedimento acima para preencher a tabela com mensagens de e-mail da seguinte forma:
Begin
Load_Emails;
End;

Agora você pode consultar a tabela MAIL_INBOX para visualizar as mensagens de e-mail.
Select * from mail_inbox;
Baixe este projeto do GitHub

Tutoriais relacionados:

  • Como obter o BLOB do arquivo em PL/SQL?
  • Oracle UTL_SMTP:exemplo de envio de e-mail com anexo usando autenticação Oracle Wallet