Artigo: Ler Email do servidor com IMAP e PHP - Gigasystems

PHP

Em por

No tutorial de hoje, vamos aprender como realizar uma conexão com seu Servidor de Email na web seja ele qual for, utilizando o protocolo IMAP e realizar uma leitura do mesmo em seu sistema PHP. Tive muitas dúvidas, pesquisei bastante até chegar numa solução, portanto se você chegou até aqui, seus problemas acabaram!

ler email do servidor com imap e php

O IMAP, conhecido como Protocolo de Acesso às Mensagens de Internet (Internet Message Access Protocol) é um protocolo de acesso a mensagens de internet. E neste artigo, vamos aprender como tirar o máximo de proveito do protocolo IMAP usando PHP.

Ai você me pergunta... Porque utilizar IMAP se tantas pessoas utilizam POP3 para baixar e ler e-mails? A resposta é simples confira:

Entendendo como funciona o IMAP

Imagine que seus e-mails estão sendo armazenadas num computador, chamado de servidor de e-mails e que este mesmo servidor se encontra online, disponível na internet para acesso de qualquer lugar.

Para ler uma mensagem, é necessário conversar com o servidor de e-mails, utilizando uma linguagem que ele entenda. No nosso caso o IMAP.

Com o IMAP é possível abrir uma conexão com o servidor de e-mails, ler mensagens, alterar seus status e até mesmo apagar as mensagens do servidor. A grande diferença entre o IMAP e o POP3 é que ele faz a leitura de uma cópia das mensagens existentes no servidor de e-mails, permitindo que tenhamos acesso às mensagens de outros lugares diferentes como smartphone, tablet, notebook ou Webmail, ou seja, ele não baixa o e-mail para sua máquina, mantendo sempre sua caixa de entrada “física” intacta.

O POP3, apesar de permitir a mesma façanha do IMAP, foi projetado para baixar as mensagens para um computador e depois apagar todas as mensagens do servidor de e-mails, sendo assim, você não terá mais acesso a esse e-mail baixado em nenhum lugar a não ser no local que você baixou.

Hoje em dia isso se torna totalmente inviável, em vista que na era da tecnologia nos tempos atuais, você precisa acessar essas informações de onde quiser e não somente em um único local.

Funções IMAP

A linguagem PHP possui um conjunto de funções que auxiliam na leitura e manipulação de mensagens de e-mails utilizando o protocolo IMAP. Caso você tente utilizar alguma função deste tutorial e receba a mensagem “Fatal error: Call to undefined function imap_open()” é porque seu PHP não está configurado para permitir o uso delas. Numa situação como esta, vai ser necessário habilitá-la via (PHP.ini).

Importante lembrar que não iremos abordar todas as funções do IMAP, e sim por questões mais objetivas e didáticas, iremos apenas abordar algumas das funções IMAP, mas para aqueles que gostam sempre de adquirir mais conhecimento ou apenas para fuçar, no site do PHP temos a documentação completa dessa função, confira no link //php.net/manual/pt_BR/book.imap.php

Abrindo uma conexão IMAP

Para abrir uma conexão com o servidor de e-mails, vamos usar a função imap_open. Ela possui três argumentos: nome do serviço, usuário e senha de acesso ao servidor.

O nome do serviço é um texto entre chaves determinando a forma como a conexão será aberta. Ele é composto pelo nome do servidor (ou IP), porta de entrada e lista de atributos.

Cada atributo indica uma característica da conexão como uso de SSL, TLS, certificado digital e protocolo de comunicação. Além disso, cada atributo é iniciado por uma \.

No final do nome do serviço, após as chaves, encontramos o nome da caixa de e-mails onde as mensagens serão lidas. Normalmente INBOX representa a caixa de entrada.

/* Ler um e-mail */
//Conecta-se ao MailServer
$host = "imap.exemplo.com.br"; 
$usuario = "exemplo@exemplo.com.br";
$senha = "sua-senha";
//recebe a conexao
$mbox = imap_open("{".$host.":143/novalidate-cert}INBOX", $usuario, $senha)or die("can't connect: " . imap_last_error());

Nesse trecho de código, criamos algumas variáveis para receber as informações necessárias para realizar a conexão com o servidor de E-mail.

Obtendo sucesso em sua conexão você já estará conectado ao servidor de e-mail, então agora basta lermos eles da seguinte maneira.

Primeiramente precisamos descobrir quantos e-mails possuímos no servidor, para isso utilizamos uma função imap_num_msg do IMAP, ela nos retornará o número de e-mails que possuímos na caixa de entrada para fazermos a varredura completa das mensagens utilizando um laço de repetição.

for($m = 1; $m <= imap_num_msg($mbox); $m++){
	//ele vai repetir esse laço enquanto houver mensagens
}

Agora vamos à leitura de fato.

for($m = 1; $m <= imap_num_msg($mbox); $m++){
	//ele vai repetir esse laço enquanto houver mensagens
	$header = imap_headerinfo($mbox, $m);
	$body = imap_fetchbody ($mbox, $m,1.2);
	echo '<li>';
    	echo '<h2>';
    	echo $header->subject 
            . ', ' 
            . date('d-m-Y H:i:s', strtotime($header->date));
   	 echo '</h2>';
   	 echo '<hr>';
   	 echo '<p>' . $body . '</p>';
    	echo '</li>';
}

Nesse laço de repetição fazemos o seguinte, pegamos o cabeçalho do e-mail através da função imap_headerinfo que nos retorna um array contendo todas as informações do e-mail, como data de recebimento, assunto, se foi lido ou não etc.

Após isso pegamos o corpo do e-mail com a função imap_fetchbody, ela nos retorna a mensagem do e-mail em si.

Note que o código acima faz uma leitura de todas as mensagens existentes na caixa de entrada e imprime o assunto da mensagem, a data e o corpo da mensagem numa lista não numerada.

Quem não tiver algum conhecimento dos formatos de mensagens de e-mail, pode explorar a variável $header usando a função var_dump($header); para obter outras informações sobre o e-mail encontrado, pois o var_dump imprime na tela o array contendo todas as informações do cabeçalho do e-mail.

Outra coisa que vale a pena mencionar é que a mensagem está crua, sem nenhum tratamento e contendo todos os MIME Types e anexos, quando eles existirem.

Marcando a mensagem no E-mail com lida

Após termos realizado a leitura das mensagens, nós podemos marcar elas como lidas, respondidas, sinalizadas conforme sua necessidade.

imap_setflag_full($mbox, $uid, "\\Seen", ST_UID);

Nesse trecho estamos apenas marcando como lida/visualizada as mensagens no servidor, você pode passar quantos parâmetros quiser e fazer todas as suas marcações.

E depois que acabarmos de ler todas nossas mensagens, temos que fechar nossa conexão com o servidor através do comando:

imap_close($mbox);

Prontinho, nós acabamos de realizar uma leitura dos e-mails em seu servidor através do PHP.

No próximo artigo vou ensinar vocês a como verificar se existe anexo no email e realizar o download do mesmo em sua pasta local para visualização.

Dúvida critica ou sugestões comentem abaixo que teremos o prazer em ajuda-los. =)

Olá, deixe seu comentário para Ler Email do servidor com IMAP e PHP

Já temos 12 comentário(s). DEIXE O SEU :)
Marcio Sales

Marcio Sales

Interessante. Gostei da abordagem....
★★★★★DIA 01.06.18 10h38RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Guilherme karan

Guilherme karan

quando rodo o script ele le todos os emails, minha ideia e trazer estes para um banco e isso ja faz..
porem, se roda lo novamente ele trará os emails que ja foram importados novamente mais os novos, como poderia identificar e importar apenas os emails que nao foram importados ainda?
★★★★★DIA 31.05.18 21h12RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Marcos Martins

Marcos Martins

Bom dia Guilherme,


experimente usar a função imap_num_recent() após abrir a conexão, se for maior que 0, você segue o processo normal para ler as mensagens, senão já abandona a função imediatamente, segue exemplo:


//recebe a conexao
$mbox = imap_open("{".$host.":143/novalidate-cert}INBOX", $usuario, $senha)or die("can't connect: " . imap_last_error());


$numero_mens_nao_lidas = imap_num_recent($mbox);


if($numero_mens_nao_lidas > 0):


     //continua o fluxo normal


endif;


 


Posta aqui se deu resultado satisfatório, assim podemos ajudar mais pessoas!


 


Att Marcos

★★★★★DIA 01.06.18 10h54RESPONDER
N/A
Enviando Comentário Fechar :/
Guilherme karan

Guilherme karan

Bom dia Marcos,

maravilha, vou ajustar o script.

Obrigado pelo retorno.
★★★★★DIA 01.06.18 11h15RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Marcos Martins

Marcos Martins

Só não esqueça de postar se deu certo, OK! Outros usuários agradecem... =)

★★★★★DIA 01.06.18 11h35RESPONDER
N/A
Enviando Comentário Fechar :/
Fabiano Lacerda

Fabiano Lacerda

Conheço esse framework hem.... hahaha Também sou aluno UPInside e fazendo uma pesquisa sobre puxar dados de e-mail acabei encontrando seu Blog. Esse método utilizado no artigo ainda funciona?
★★★★★DIA 19.05.18 19h13RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Marcos Martins

Marcos Martins

Bom dia Fabiano,


sim, o método ainda funciona normalmente!


 


Att Marcos

★★★★★DIA 21.05.18 08h27RESPONDER
N/A
Enviando Comentário Fechar :/
CLEDISSON CANUTO santos

CLEDISSON CANUTO santos

como baixar apenas arquivos xml
★★★★★DIA 12.06.17 00h21RESPONDER
N/A
Enviando Comentário Fechar :/
Paulo Ribeiro

Paulo Ribeiro

Depois que eu rodar esse código, digamos uma semana depois eu rodo de novo ele vai ler os e-mail marcados como lidos? ou somente os novos?
★★★★★DIA 12.05.17 15h45RESPONDER
N/A
Enviando Comentário Fechar :/
leo leo

leo leo

Parabéns pelo artigo, fiquei com uma duvida, na hora de seta o e-mail como lido, o que é e de onde vem a variável $uid?
★★★★★DIA 16.08.16 09h51RESPONDER
N/A
Enviando Comentário Fechar :/
Claudinei santos

Claudinei santos

Me ajudou muito valeu!!
★★★★★DIA 22.07.16 12h53RESPONDER
Leonardo Martins
Enviando Comentário Fechar :/
Thiago Mauricio

Thiago Mauricio

Ótimo artigo! Ajudou muito, valeu!
★★★★★DIA 20.07.16 13h07RESPONDER
Leonardo Martins
Enviando Comentário Fechar :/
Enviando Comentário Fechar :/

Veja Também:

Artigos Relacionados a categoria: PHP

Soluções

...CURTIU? AINDA NÃO VIU NOSSO PORTFÓLIO?


Se ainda não viu nosso Portfólio e quer conhecer um pouco mais... aproveite, veja agora mesmo nossos Cases de Sucesso e tenha seu site nos padrões atuais preparado para maioria dos dispositivos e navegadores.