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. laugh

Veja Também:

Artigos Relacionados a categoria: PHP

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

Já temos 7 comentário(s). DEIXE O SEU :)
Thiago Mauricio

Thiago Mauricio

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

Claudinei santos

Me ajudou muito valeu!!
★★★★★ DIA 22.07.16 12h53 RESPONDER
Leonardo Martins
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 09h51 RESPONDER
N/A
Enviando Comentário Fechar :/
Leonardo Martins

Leonardo Martins

Bom dia, obrigado pelo seu comentário.

Sobre sua dúvida é o seguinte a variável $uid você cria ela dentro for que ira verificar todas as mensagens em imap_num_msg, certo ? Ai essa variável é criada e ela representa o ID da mensagem na sua caixa de email, ou seja, você vai conseguir marcar como lido seu email através desse ID, e você obtém ele dessa maneira ---> $uid = imap_uid($mbox,$m); assim você além de controlar qual mensagem está manipulando na hora do evento, você também pode guarda-la em seu BD por algum motivo que venha utilizar, ou somente para registro ! Espero que tenha ficado claro, qualquer dúvida pergunte e tentaremos lhe ajudar!
★★★★★ DIA 19.08.16 10h36 RESPONDER
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 15h45 RESPONDER
N/A
Enviando Comentário Fechar :/
CLEDISSON CANUTO santos

CLEDISSON CANUTO santos

como baixar apenas arquivos xml
★★★★★ DIA 12.06.17 00h21 RESPONDER
N/A
Enviando Comentário Fechar :/
Enviando Comentário Fechar :/

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

Se ainda não viu nosso Portfólio e quer conhecer um pouco mais... aproveite e veja agora mesmo e tenha um site de qualidade para o seu negócio!

[contato]
Ver o Portfólio Agora