Imap (Internet Message Access Protocol – Protocolo de Acesso a Mensagem da Internet) e pop3 (Post Office Protocol – Protocolo dos correios) são protocolos de internet para e-mail e que possibilitam a programas de e-mail (clientes) se conectarem aos servidores de mensagens eletrônicas e recuperar as mensagens. Através do protocolo Imap, vários clientes podem acessar a mesma caixa de entrada e recuperar as mensagens que continuam com a original no servidor. Já o protocolo pop3 transfere as mensagens, removendo-as definitivamente do servidor, deixando estes e-mails indisponíveis para o webmail ou outro programa de e-mail.

A classe receivemail.class.php é a responsável por se conectar a caixa de entrada de e-mail via protocolo imap ou pop3. Além disso, ela verifica o total de mensagens, lista e recupera anexos das mensagens,deleta mensagens e fecha a conexão com o servidor de email.

Para ativar essa funcionalidade no PHP, é necessário descomentar no arquivo php.ini a linha que contém o código abaixo:


extension=imap.so

Remova o ; no início da linha, salve e reinicie o servidor web. A página http://php.net/manual/pt_BR/book.imap.php contém as principais funções imap que o PHP possui e suas definições.

As funções utilizadas na classe acima são:

  • imap_open = Abre um fluxo de conexão com uma caixa de entrada de correio eletrônico.
  • imap_header = Recupera os cabeçalhos da mensagem de email.
  • imap_fetchstructure = Recupera a estrutura de uma mensagem em particular.
  • imap_fetchbody = Retorna uma seção específica do corpo de uma mensagem.
  • imap_delete = Exclui uma mensagem específica do servidor.
  • imap_close = Encerra uma conexão com o servidor de correio.

A função receiveMail possui sete parâmetros para realizar a comunicação com o servidor de e-mail. São eles: usuário, senha, e-mail, servidor, tipo, porta e segurança ssl. Caso o protocolo utilizado seja imap, a porta será definida como 143 por default e para o protocolo pop3 a porta definida é 110.

A parte do servidor é delimitada pelos { e } e consiste no nome do servidor e/ou endereço IP, o sinal de : que antecede a porta, a especificação do protocolo utilizado, separado por /, no servidor utilizado. Não é necessário o uso de certificados, fato que mereceu adicionar novalidate-cert, isto é, para os servidores que utilizam certificados auto-assinados, isso é importante para permitir o fluxo de dados entre a aplicação e o servidor. Após o }, a palavra INBOX representa a caixa de entrada; a pasta principal nada impede que direcione o acesso para uma outra pasta qualquer criada pelo usuário.

A função connect() recebe o objeto da conexão com o servidor e armazena na variável marubox o retorno deste objeto, caso contrário, é emitido uma mensagem de erro.

A função getHeaders() é responsável por obter os cabeçalhos de cada mensagem de e-mail, através da função imap_headers do PHP. Esta última retorna um objeto com diversas propriedades, à saber:

  • toaddress = endereço completo limitado a 1024 caracteres.
  • to = um array de objetos.
  • fromaddress = endereço completo do remetente limitado a 1024 caracteres.
  • from = um array de objetos com as propriedades do remetente.
  • ccaddress = endereço completo do campo com cópia limitado a 1024 caracteres.

Além das propriedades listadas acima, existem: cc, bcc, reply_to, sender, return_path, remail, date, subject, message_id, references, recent para mensagens recebidas recentemente, flagged para mensagens marcadas, answered para mensagens respondidas (A para respondidas e “ ” para não respondidas), size, udate data unix do servidor entre outras propriedades. Para detalhes, consultar o manual no link informado.

Dentro da função foi criado um array capturando apenas os campos necessários neste exemplo: from, fromName, toOth, toNameOth, subject, to e date .

O retorno é o array solicitado acima.

A função GetAttach verifica a estrutura da mensagem e busca no corpo da mensagem o tipo de codificação utilizada no arquivo anexo, realiza a leitura do conteúdo e recria esse arquivo no diretório informado pelo segundo parâmetro da função que é o path.

  • A função getBody() recebe como parâmetro o número da mensagem e obtêm o corpo da mensagem em texto ou HTML.
  • A função deleteMails() recebe como parâmetro o número da mensagem e realiza a exclusão no servidor.

É importante salientar que o número da mensagem não é fixo: se existe no servidor 10 mensagens na caixa de entrada do e-mail, ao excluir a mensagem 1, a caixa de entrada terá 9 mensagens e a posição 1 será ocupada pela mensagem seguinte.

Em um exemplo bem simples, no arquivo exibe_emails.php, após se conectar, capturar o total de mensagens na caixa INBOX, um laço "for" pode recuperar as mensagens, e o retorno de alguns campos como fromName e toName retornam com caracteres tipo MIME, assim:


FromName :: =?iso-8859-1?B?Sm9z6SBEYXJjaSBSb2RyaWd1ZXMgSnVuaW9y?=

Para corrigir, basta aplicar a função imap_utf8 na variável que armazena este conteúdo.

No mesmo arquivo, para recuperar os anexos de cada mensagem, a função GetAttach() na linha 48 de exibe_emails.php, recebe o numero da mensagem e o path onde o arquivo será gravado, após esse procedimento, o comando foreach foi utilizado para listar os anexos quando existirem de cada mensagem.

Os anexos serão salvos na pasta, se existir permissão na pasta escolhida, no servidor web.

Com estas funcionalidades, pode-se salvar as mensagens da caixa de entrada em um banco de dados por exemplo, criar um work flow em um sistema e reunir as mensagens pertinentes a um determinado assunto, permitindo que um usuário não tenha que fazer buscas de e-mails especificamente em cliente de e-mail ou webmail.