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.
Confira outros conteúdos:
Perguntas frequentes
Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa bagagem consegui um estágio logo no início do meu primeiro período na faculdade.
Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a pena, pois a plataforma é bem intuitiva e muuuuito didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento front-end, tinha coisas que eu ainda não tinha visto. A didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado, adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É um passo a passo incrível. Só não aprende quem não quer. Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da programação, irei assinar meu contrato como programador graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana, aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na área.