Tecnicamente, os E-Mails são enviados através do protocolo SMTP (Simple Mail Transfer Protocol), o qual redireciona para um Servidor Recipiente para E-Mails, este servidor armazena a Mensagem e seus arquivos anexos, armazenando-as em suas dependências. Para que um usuário receba estas mensagens, é necessário que conecte ao Servidor de POP (no nosso caso, existem outros protocolos para esse fim), o qual irá requisitar um login. Assim que efetuado o login, o usuário poderá receber e ler suas mensagens.
Note que para conectar-se a um Servidor SMTP não é necessário um login, porém no POP3 é necessário pois, sem o login seria permitido a qualquer usuário receber mensagens que não lhe pertencem.
A conexão com um Servidor POP3 (Post Office Protocol, version 3), para recebimento de E-Mails, no Borland Delphi é encapsulada por um componente que está localizado na guia FastNet da palheta de componentes, chamado NMPOP3.
Este componente encapsula todas as funcionalidades presentes em um Cliente POP3 de recebimento de E-Mails. Para entendermos bem a técnica que este artigo focaliza iremos utilizar um DEMO que acompanha o Delphi, localizado em:
$(DELPHI)\Demos\FastNet\Pop3\POP3DEMO.DPR ($(DELPHI), representa o diretório em que o Borland Delphi foi instalado).
Ao abrirmos o Exemplo ,o Form Designer estará com esta aparência:

Para conectar a um Servidor POP3 através deste componente, é necessário de antemão, configurar as propriedades Host, Port, UserID e Password. Estas propriedades são referentes à conexão e login. Abaixo segue uma pequena descrição sobre cada propriedades mencionada:
Host: nesta propriedade configuramos qual o endereço do servidor POP3 que armazena nossa Caixa de E-Mail.
Port: utilizada para especificar em qual porta do Servidor POP3 o componente irá conectar a Aplicação.
UserID: define qual o "Nome do Usuário" (Username) da Caixa de E-Mail. É através desta propriedade que o Servidor pode localizar em qual Caixa de E-Mail estão as mensagens do usuário.
Password: indica a Senha (Password) da Caixa de E-Mail.
O protocolo POP3 é acessado pela porta padrão 110, mas o componente NMPOP3 não impede acessar o Servidor POP através de outras portas. Este componente também possui propriedades adicionais como: Parse que especifica se os arquivos anexos são separados da mensagem ou não.
Como podemos visualizar em nosso exemplo, este possui: um formulário, um componente StatusBar, um componente PageControl com 3 guias, alguns controles internos as guias, e o componente principal: NMPOP3.
Na primeira guia "Connection/Account", configuramos as principais propriedades que nos asseguram uma conexão com o Servidor POP3. Os componentes Edit's estão intimamente ligados as propriedades: Host, Port, UserID, Password, através do evento OnClick do botão "Connect" (Button1), como listado abaixo:
procedure TForm1.Button1Click(Sender: TObject);
begin
NMPOP31.AttachFilePath := '.';
NMPOP31.DeleteOnRead := FALSE;
NMPOP31.ReportLevel := Status_Basic;
NMPOP31.TimeOut := 20000;
NMPOP31.Host := Edit1.Text;
NMPOP31.Port := StrToInt(Edit2.Text);
NMPOP31.UserID := Edit3.Text;
NMPOP31.Password := Edit4.Text;
NMPOP31.Connect;
Label10.caption := '# of
Messages: '+IntToStr(NMPOP31.MailCount);
end;
No evento OnClick deste botão é encapsulado o processo de conexão, embora o código utilizado não esteja escrito da melhor forma, facilita a explicação do código:
- Começamos na primeira linha, onde é configura a propriedade AttachFilePath. O valor atribuído a esta propriedade foi ".". Esta propriedade permite configurar o diretório padrão, que irá armazenar os arquivos anexos dos E-Mail's recebidos. Se não for atribuído nenhum valor a esta propriedade, os arquivos anexos serão salvos no diretório padrão da Aplicação.
- Em seguida, através da propriedade DeleteOnRead, poderemos indicar ao componente se após ter lido determinada mensagem, ela será removida. Este procedimento é o procedimento normal dos Clientes POP3 atuais.
- Logo após, na terceira linha do código do evento OnClick, é configurada a propriedade ReportLevel que especifica o nível de detalhamento do relatório passado pelo evento OnStatus, chamado cada vez que o componente muda de Status. Note que tanto a propriedade ReportLevel quanto o evento OnStatus são derivados de sua classe ancestral chamada TPowerSock.
- Em seguida, é configurada a propriedade TimeOut do componente, que especifica o tempo limite (em milissegundos) para espera de resposta do Servidor. Por exemplo quando é executado
um método que dependa da comunicação do Servidor, caso o Servidor ultrapasse o tempo limite especificado na propriedade TimeOut, o componente irá disparar uma exceção e a operação será abortada. Se esta propriedade for configurada com o valor 0, o Servidor não terá tempo máximo de resposta, e nenhuma exceção será lançada. Note que está propriedade também deriva da classe TPowerSock.
- Nas próximas são configuradas as propriedades principais, de acordo com os Textos introduzidos pelo usuário em tempo de execução nos Edit's.
- Após ser configurada a propriedade Password, é codificada uma linha que executa o método "Connect". Este método é utilizado para conectar ao Servidor POP3. Atenção, este método somente deve ser chamado após terem sido configuradas todas as propriedades principais de comunicação entre o componente e o Servidor POP3. Note que este método é derivado da classe TPowerSock. Se ao tentar conectar ao Servidor POP3 com este método, e a conexão não for possível pelo fato de o Endereço do Servidor ser inválido, este método dispara uma exceção caso for chamado o evento OnInvalidHost e seu parâmetro Handled estiver configurado como False ou se neste mesmo evento não for configurado um valor válido para a propriedade Host.
Caso a conexão falhe por outro motivo o evento OnConnectionFailed é chamado e seu manipulador executado. Se a conexão for efetuada com sucesso o manipulador de evento do OnConnect é executado.
- Terminados estes passos, a última configura o Caption do Label10 com o número de mensagens encontradas no Servidor POP3, note que a propriedade que contém o número de mensagens localizadas na Caixa de E-Mail é MailCount do componente NMPOP3.
Com este trecho de código pudemos configurar todas as propriedades necessárias para uma conexão com o Servidor POP3 e em seguida conectar a Aplicação.
Podemos agora entender o código executado quando pressionado o botão "Disconnect" (Button2):
NMPOP31.Disconnect;
Como podemos perceber, o código não envolve nenhum mistério. No manipulador de evento é chamado apenas o método Disconnect do componente NMPOP3, que nos executa a ação de desconectar do Servidor POP3. Caso o método seja executado com sucesso o evento OnDisconnect é chamado e seu manipulador de evento executado. Esse evento, também, deriva da classe TPowerSock.
Em seguida, clicamos na segunda guia do PageControl, veremos que o Form Designer possui uma aparência semelhante à figura abaixo.

Observe que não estão sendo explicados os conceitos de outros componentes ou controles, pois estamos enfatizando no artigo apenas o componente NMPOP3 e sua forma de receber E-Mails.
Chame o manipulador de evento OnClick do botão "List Messages" (Button5) localizado na segunda guia da Aplicação. Ao chamar o código do manipulador de evento
OnClick, é listado o código abaixo:
NMPOP31.List;
Como podemos ver, é um código muito simples, consiste na chamada do método List do componente NMPOP3. O método é utilizado para que o componente traga uma lista de E-Mail's da Caixa localizada no Servidor POP3. Para utilizar esse método é necessário que o componente esteja conectado ao Servidor POP3.
Caso o componente não esteja conectado e aquele seja chamado, será disparado o evento OnConnectRequired. Se o método for executado com sucesso, será disparada o evento OnList do componente que faz com que sejam listados os identificadores dos E-Mail's e seus respectivos tamanhos em bytes. Essas informações são passadas por parâmetros para o evento OnList através dos identificadores chamados como Msg (identificador da Mensagem) e Size (tamanho da Mensagem em Bytes), respectivamente.
Caso ocorra algum erro no evento OnList, será disparada uma exceção. Perceba que o método List, e o evento OnList do componente estão intimamente ligados.
O evento OnConnectRequired é disparado caso a conexão seja requerida por algum método do componente que somente será executado caso a conexão esteja efutuada. Nesse evento é passado um parâmetro por referência variável, o qual designa se o problema de conexão foi tratado no manipulador de evento, ou não. Caso o parâmetro seja configurado como False, ao término do manipulador de evento é disparada uma exceção. Observe que o evento é derivado da classe TPowerSock.
Logo após temos um botão "Clear" e um controle Memo. O botão é usado somente para limpar o Memo que irá conter a lista de Mensagens do Servidor POP3.
Em seguida podemos clicar na terceira guia,"Checking Mail", a qual permanecem alguns controles para interface com o usuário. Após clicarmos ns guia, o Form Designer estará com uma aparência semelhante à figura abaixo:

Comecemos mostrando que toda mensagem de E-Mail possui um Header e um Body. O Header de uma mensagem é cabeçalho, e possui informações técnicas sobre E-Mail. Note que o Header é obtido através da propriedade Head da propriedade MailMessage do componente NMPOP3. De forma contrária, o Body apenas armazena o corpo da mensagem, é obtido através da propriedade Body da propriedade MailMessage do NMPOP3.
Para receber um Mail basta executar o comando GetMailMessage, o qual chamamos no manipulador de evento OnClick do botão "Get Message" (Button3). Esse método preenche a propriedade MailMessage, a qual armazena todas as informações do E-Mail trazido pelo método GetMailMessage. Suas propriedades são:
Attachments: do tipo StringList, armazena em cada linha, o caminho de cada arquivo anexo recebido neste E-Mail.
Body: também do tipo StringList, armazena o corpo da mensagem enviada.
From: possui , como valor, uma String que contém o endereço de E-Mail do remetente.
Head: contém o cabeçalho da mensagem armazenado em uma espécie de StringList.
MessageID: retorna uma String com o Identificador do E-Mail. Em questão, esse identificador foi criado pelo Servidor POP3.
Subject: armazena uma String com o Título da mensagem.
Assim, após serem vistas todas essas propriedades, podemos continuar com a explicação baseada no exemplo de utilização do componente NMPOP3, que acompanha o Borland Delphi.
Clicando duas vezes no botão "Delete" (button7), o código abaixo é mostrado no Code Editor:
NMPOP31.DeleteMailMessage(StrToint(Edit5.Text));
Neste trecho de código, que foi encontrando no manipulador de evento OnClick do botão
"Delete", é chamado o método DeleteMailMessage. Este método tem como objetivo remover a mensagem, especificada pelo parâmetro MailNumber, do Servidor POP3. Utilize este método para remover mensagens do Servidor POP3, porém faça-o com atenção, pois a mensagem será removida sem que possa ser restaurada.
Com este método aliado a propriedade MailCount do componente, poderíamos criar um laço que limpasse a Caixa de E-Mail, removendo as mensagens especificadas.
Se ao chamar este método, algum erro ocorrer o evento OnFailure será chamado, e uma exceção será disparada. Caso o método seja executado com sucesso, o evento OnSuccess do componente será chamado. Ao chamar este procedimento, como muitos outros definidos na classe TNMPOP3, será requerido apenas um parâmetro chamado MailMessage do tipo Integer, que nos permite passar o Identificador da Mensagem.
No trecho de código acima, foi passado como parâmetro para o método o valor da propriedade Text do componente Edit5. Note que é neste controle que o usuário irá indicar qual a mensagem a ser deletada.
Em seguida, podemos chamar o manipulador de evento do botão "Get Message" (button3), que exibe o código abaixo:
procedure TForm1.Button3Click(Sender: TObject);
var i:integer;
begin
for i:=1 to 500 do
NMPOP31.GetMailMessage(StrToInt(Edit5.Text));
Edit6.Text := NMPOP31.MailMessage.From;
Edit7.Text := NMPOP31.MailMessage.Subject;
Edit9.Text := NMPOP31.MailMessage.MessageID;
Memo2.Lines.Assign(NMPOP31.MailMessage.Head);
Memo1.Lines.Assign(NMPOP31.MailMessage.Body);
If NMPOP31.MailMessage.Attachments.Text <> '' then
ShowMessage('Attachments:'+#10#13+NMPOP31.MailMessage.Attachments.Text);
end;
Podemos perceber, que basicamente, esse trecho de código, apenas roda um laço for que executa o método GetMailMessage, e atualiza a interface de usuário. Ao término do código , testamos se a propriedade Text da Propriedade Attachments da propriedade MailMessage do componente NMPOP3 está vazia, caso não esteja, será mostrada uma caixa de mensagem que indica as linhas encontradas na propriedade listada, as quais indicam os path's para os arquivos anexos.
Logo após encontramos o botão "Get Summary" (button6), que ao ser clicado, nos retorna o "Sumário" de uma mensagem. O Sumário é, basicamente, um conteúdo que possui apenas algumas informações sobre a mensagem. O método GetSummary, tecnicamente, preenche a propriedade Summary do componente.
O método preenche esta propriedade apenas, se o conteúdo for retornado. Caso ocorra um erro , durante a execução desse método, uma exceção será gerada. O código do manipulador de evento do botão "Get Summary" não será listado devido a sua simplicidade. O passo mais importante neste Handler de evento é o fato de ser chamado o método mencionado acima, que não retorna a mensagem em si, e sim um sumário dela.
Note que nos restam apenas componentes visuais que fogem do escopo deste artigo. Porém é bom deixar claro, que os controles são utilizados apenas para mostrar os resultados aos usuários da aplicação.
Conclusão
Vimos como é simples criar uma Aplicação que receba E-Mail's através do protocolo POP3 que faz parte do conjunto de protocolos TCP/IP. No Borland Delphi está conexão com um Servidor POP3 é encapsulada pelo componente NMPOP3 da guia FastNet, embora existam outras técnicas que poderão ser utilizadas para esse fim. Mas, deixaremos estas técnicas para serem abordadas em outros exemplos.
Além dos eventos listados aqui o componente NMPOP3 possui outros eventos que valem a pena ser estudados para um melhor controle sobre: conexão, os pacotes enviados/recebidos pela aplicação e erros.
Considerações Finais
Vimos como o Borland Delphi se torna uma ferramenta poderosa na criação de Aplicações que acessam Servidores POP3 através de protocolos "padrão" da InterNet. Note que no Borland Delphi há outras técnicas, que nos permitem criar, até mesmo o Servidor POP3.
Também é possível encontrar inúmeros componentes de terceiros que facilitam a manipulação deste protocolo. Até a próxima pessoal!
autor: Pedro H. dos Santos
|