PHP
Ler Email do servidor com IMAP e PHP
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!
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. =)
Gigasystems Login:
Informe seu e-mail abaixo para continuar!
XVeja Também:
Artigos Relacionados a categoria: PHP
Cotações para compra e venda de Moedas estrangeiras com PHP
27 July de 2016
Gerenciador de dependências Composer
14 January de 2016
Erro ao acessar um arquivo externo com o comando file_get_content
04 November de 2015
Baixando anexo do email no servidor com IMAP e PHP
27 August de 2015
Olá, deixe seu comentário para Ler Email do servidor com IMAP e PHP
Gustavo Arrais
Primeiro parabéns pelo site muito útil p mim.
Poderiam me ajudar onde encontro um script para RECEBER email p Asp?
Antecipadamente muitooo obrigado
Claudio Morking
Claudio Morking
Marcio Sales
Guilherme karan
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?
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
Guilherme karan
maravilha, vou ajustar o script.
Obrigado pelo retorno.
Marcos Martins
Só não esqueça de postar se deu certo, OK! Outros usuários agradecem... =)
Marcus Vinicius
Fabiano Lacerda
Marcos Martins
Bom dia Fabiano,
sim, o método ainda funciona normalmente!
Att Marcos
Wellington Junior
CLEDISSON CANUTO santos
Paulo Ribeiro
leo leo
Claudinei santos
Thiago Mauricio