Sim deu certo, porém tenho problemas com o tratamento do corpo do e-mail que recebo.
Principalmente no tratamento dos anexos.
Por ex. e-mails com prioridade alta ocasionam erros de leitura.
Creio que o porque seja por eles possuírem uma estrutura diferente.
Estou adaptando alguns códigos que encontrei na Internet para testar isso,
imagino que terei que tratar cada caso separadamente.
Abaixo segue o código que estou testando, não me recordo as fontes pois fui pesquisando e adicionando as linhas.
Ele ainda está bagunçado e bem amarrado à minha rotina, afinal tem um método que faz tudo =),
que é fazer a leitura de e-mails, e baixar o anexos JPG em uma pasta,
após baixados ele move o e-mail para uma pasta ‘lidos’ no servidor de e-mail.
Pretendo separar essa rotina em mais funções e adicionar outras para cada operação.
Caso alguém tenha alguma contribuição favor postar. =)
class readattachment {
function getdecodevalue($message,$coding) {
if ($coding == 0) {
$message = imap_8bit($message);
} elseif ($coding == 1) {
$message = imap_8bit($message);
} elseif ($coding == 2) {
$message = imap_binary($message);
} elseif ($coding == 3) {
$message=imap_base64($message);
} elseif ($coding == 4) {
$message = imap_qprint($message);
} elseif ($coding == 5) {
$message = imap_base64($message);
}
return $message;
}
function savedata($host, $login, $password, $savedirpath, $moveToFolder) {
$mbox = imap_open($host, $login, $password) or die("can't connect: " . imap_last_error());
$message = array();
$message["attachment"]["type"][0] = "text";
$message["attachment"]["type"][1] = "multipart";
$message["attachment"]["type"][2] = "message";
$message["attachment"]["type"][3] = "application";
$message["attachment"]["type"][4] = "audio";
$message["attachment"]["type"][5] = "image";
$message["attachment"]["type"][6] = "video";
$message["attachment"]["type"][7] = "other";
$check = imap_mailboxmsginfo($mbox);
echo "Date: " . $check->Date . "\n" ;
echo "Driver: " . $check->Driver . "\n" ;
echo "Unread: " . $check->Unread . "\n" ;
echo "Size: " . $check->Size . "\n" ;
$numero_mensagens = imap_num_msg($mbox);
$numero_mens_nao_lidas = imap_num_recent($mbox);
if ($numero_mensagens == 1) {
echo "\nVoce tem $numero_mensagens mensagem.";
} else {
echo "\nVoce tem $numero_mensagens mensagens.";
}
echo "\n";
//aqui faço um loop para printar na tela o cabeçalho dos e-mails
for($i = 1;$i <= imap_num_msg($mbox);$i++) {
$headers = imap_header($mbox, $i);
$assunto = $headers->subject;
$message_id = $headers->message_id;
$toaddress = $headers->toaddress;
$to = $headers->to;
//$remetente = $to[0]->personal;
$email_remetente = $to[0]->mailbox;
$servidor_remetente = $to[0]->host;
$data = $headers->date;
$data = strtotime($data);
$data = date("d/m/Y H:i:s", $data);
echo "\n#$i - Assunto = $assunto - Remetente = $email_remetente@$servidor_remetente Data = $data";
}
//o mesmo loop só que agora para baixar os anexos, os erros ocorrem daqui para baixo
for ($jk = 1; $jk <= imap_num_msg($mbox); $jk++) {
$structure = imap_fetchstructure($mbox, $jk);
$parts = $structure->parts;
$fpos = 2;
for($i = 1; $i < count($parts); $i++) {
$message["pid"][$i] = ($i);
$part = $parts[$i];
if($part->disposition == "attachment") {
$message["type"][$i] = $message["attachment"]["type"][$part->type] . "/" . strtolower($part->subtype);
$message["subtype"][$i] = strtolower($part->subtype);
$ext = $part->subtype;
$params = $part->dparameters;
$filename = $part->dparameters[0]->value;
$extens = strtolower(substr($filename, -4));
if ($extens == ".jpg") {
$mege = "";
$data = "";
$mege = imap_fetchbody($mbox, $jk, $fpos);
$filename = $savedirpath . md5(uniqid(time())) . $extens;
echo "\n" . $filename;
$fp = fopen($filename, "w+");
$data = $this->getdecodevalue($mege, $part->type);
fputs($fp, $data);
fclose($fp);
}
$fpos += 1;
}
}
if ($moveToFolder != "") {
imap_mail_move($mbox, $jk, $moveToFolder);
}
}
imap_expunge($mbox);
imap_close($mbox);
}
}
$dominio = "localhost";
$servidorSmtp = "smtp." . $dominio;
$porta = "143" . "/novalidate-cert"; //pode variar conforme o servidor, adicionei esse parâmetro para resolver erros de validação
$usuario = "teste" . "@" . $dominio;
$senha = "teste123";
$conexao = chr(123).gethostbyname($servidorSmtp).":".$porta.chr(125)."INBOX"; //segundo alguns fóruns resolver o nome com 'gethostbyname' deixa a rotina mais rápida.
$moverParaPasta = "INBOX.lidos"; //deixar vazio caso não deseje mover
$diretorioDeTrabalho = "/tmp/emails";
$ra = new readattachment();
$ra->savedata($conexao, $usuario, $senha, $diretorioDeTrabalho, $moverParaPasta);