PHP
Baixando anexo do email no servidor com IMAP e PHP
Bom pessoal, no tutorial de hoje como prometido, vou lhes ensinar como realizar o download do anexo contido no e-mail em seu servidor utilizando IMAP e PHP.
No tutorial passado (Ler email do servidor com IMAP) eu ensinei a vocês a realizar apenas uma leitura dos emails contidos no servidor correto! Hoje vamos um pouco mais além, que na verdade é onde o pessoal tem uma dificuldade em encontrar algo que realmente funcione na internet, eu, por exemplo, tive muita dificuldade em achar algo bom, então vamos lá.
Baixando Anexo com IMAP
Bom, para começarmos o nosso processo, temos que fazer a conexão com nosso servidor de e-mail para podermos ler as mensagens contidas no mesmo. Para isso vamos criar nossas variáveis com os valores dos parâmetros de conexão.
/* Ler um e-mail e salvar o anexo */ //Conecta-se ao MailServer $host = "imap.dominio-it.inf.br"; $usuario = "exemplo@dominio.com.br"; $senha = "sua_senha"; $mbox = imap_open("{".$host.":143/novalidate-cert}INBOX", $usuario, $senha)or die("can't connect: " . imap_last_error());
Muito bem, feito nossa conexão temos que colocar tudo dentro de um laço para podermos percorrer toda nossa caixa de entrada.
Para isso usamos a função imap_num_msg que nos retornará o total de mensagens e o limite para que nosso laço percorra todos os e-mails que serão lidos.
//Lê todas as mensagens for($m = 1; $m <= imap_num_msg($mbox); $m++){ //suas intrucoes }
Agora vamos a cereja do bolo, rsrs...
Para capturarmos o anexo, precisamos utilizar uma função nativa do IMAP chamada imap_fetchbody, na qual ela nos retorna todo o conteúdo do e-mail, mas há um porém, o resultado que ele nos fornece vem criptografado, ou seja, um monte de códigos incompreensíveis para nossa leitura, então eis que entra uma outra função juntamente que é imap_base64, ela transformara todo aquele código bagunçado no arquivo original, ou seja, ele vai descriptografar o e-mail para nosso download.
Então nossa linha de código nesse trecho ficará assim:
for($m = 1; $m <= imap_num_msg($mbox); $m++){ //pegando o anexo e descriptografando $dados = imap_base64(imap_fetchbody($mbox, $m,2)); }
Nessa nossa variável $dados nós já temos nosso anexo, ai você me pergunta...(garanto que leu com a voz do Rezende rsrsrs)... então como faço para gravar essas informações?
A resposta é o seguinte, lembra-se de como criar arquivos com PHP, isso mesmo aquela função que você acha que nunca vai usar, pois é, vamos utiliza-la agora.
//determine o nome do arquivo $nomeAnexo = “meuArquivo.extensao”; //determine o caminho onde será gravado o anexo $caminho = anexos/'; //Cria um arquivo com o nome do anexo $arq = fopen($caminho.$nomeAnexo,"w"); //Grava o conteúdo do anexo no novo arquivo. fwrite($arq, $dados); //Fecha o novo arquivo fclose($arq);
Prontinho nosso arquivo já foi criado, vamos à explicação.
Primeiramente você determina o nome do arquivo, isso você pode coloca-lo fixo, ou gravar ele como próprio nome que vem no e-mail, para isso tem que fazer o seguinte:
//pegamos a estrutura do email $estrutura = imap_fetchstructure($mbox, $m); //pego o nome do anexo e se quiser o tipo de arquivo do anexo $nomeAnexo = $estrutura->parts[$j]->dparameters[0]->value; $extensao = strtolower(pathinfo($nomeAnexo, PATHINFO_EXTENSION));
Feito isso, você criará o arquivo exatamente com o mesmo nome que ele foi enviado no e-mail. Após escolher o nome etc..., você precisa escolher onde quer grava-lo, ou seja, o diretório para onde ele será mandado, isso fica a seu critério.
Depois vamos abrir um arquivo com a função fopen no modo w, passando o caminho e o nome do arquivo com sua extensão tudo junto.
Feito isso, vamos escrever dentro desse arquivo utilizando a função fwrite, passando qual arquivo queremos gravar, que no caso foi o que acabamos de criar, e o nosso conteúdo a ser escrito é exatamente aquela nossa variável $dados que recebeu o anexo descriptografado lembra?
Após esse procedimento, fechamos nosso arquivo depois de escrito e está pronto, você já pode ir ao diretório que determinou que seu anexo estara lá.
Realizado a leitura e o download do anexo marcamos a mensagem como lida e fechamos nossa conexão com e-mail.
//marca a mensagem como lida imap_setflag_full($mbox, $uid, "\\Seen", ST_UID); //Fecha a conexão com o MailServer imap_close($mbox);
Prontinho, nesse exemplo básico ensinado hoje, mostrei com realizar o download de qualquer arquivo anexado no e-mail, porém você pode restringir a qual arquivo você deseja fazer o download, por exemplo, somente arquivos com extensão XML ou JPG, isso dependerá da necessidade de seu sistema.
Duvidas criticas ou sugestões comentem abaixo que teremos o prazer em tentar 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
Ler Email do servidor com IMAP e PHP
19 August de 2015
Olá, deixe seu comentário para Baixando anexo do email no servidor com IMAP e PHP
Julio Malliotti
smith lopes
Vinicius Alves de Morais
Gostei do post, implementei funcionou perfeitamente, porem tenho uma duvida, como faço para fazer o download quando tenho mais de 1 anexo, os nome dos arquivos consegui, porem ao tentar baixar, acaba que baixando o mesmo arquivo, com nomes diferentes
Obrigado desde já!