Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ScornInPC

Repente II - Classe IMAP - Manipulação de Diretórios

Recommended Posts

A Classe visa manipular diretórios, métodos iniciais sãocriar diretórioapagar diretório (recursivamente)renomear diretóriolistar os diretórios (recursivamente)caso alguma coisa a mais, postem agora =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

bem, ai vai um esboço do imapDir ^^ (beleza se mudar o nome beleza)

 

<?php	class imapDir {		var $imapConexao;				function imapDir($imap) {			$this->imapConexao = $imap;		}				function criarDir($dir) {			$tag = gerarTag();			sock_send($this->imapConexao, $tag . " CREATE " . $dir);			$resposta = sock_recv($this->imapConexao);			if(substr($resposta, strlen(gerarTag()) + 1, 2) != "OK") {				return FALSE;			} else {				return TRUE;			}		}				function removerDir($dir) {			$tag = gerarTag();			sock_send($this->imapConexao, $tag . " DELETE " . $dir);			$resposta = sock_recv($this->imapConexao);			if(substr($resposta, strlen(gerarTag()) + 1, 2) != "OK") {				return FALSE;			} else {				return TRUE;			}		}				function renomearDir($dir, $novoDir) {			$tag = gerarTag();			sock_send($this->imapConexao, $tag . " RENAME " . $dir . " " . $novoDir);			$resposta = sock_recv($this->imapConexao);			if(substr($resposta, strlen(gerarTag()) + 1, 2) != "OK") {				return FALSE;			} else {				return TRUE;			}		}				function listarDir() {			$tag = gerarTag();			sock_send($this->imapConexao, $tag . " LIST INBOX *");			$resposta = sock_recv($this->imapConexao);			if(substr($resposta, strlen(gerarTag()) + 1, 2) == "NO") {				return FALSE;			}			$diretorios = array();			while(substr($resposta, strlen(gerarTag()) + 1, 2) != "OK") {				$diretorios[] = substr($resposta, strpos($resposta, "INBOX"), strlen($resposta) - strpos("INBOX", $resposta) - 30);				$resposta = sock_recv($this->imapConexao);			}			return $diretorios;		}	}?>

aqui tem o teste. aqui tem algumas funções basicas para o funcionamento da classe, tal como coneção e autenticação =)

 

<?php	function sock_recv($socket) {		while(!feof($socket)) {			$line.=fgets($socket);			if(strlen($line)>=2 && substr($line,-2)=="\r\n") {				//echo "S:> " . substr($line,0,-2) . "<br />";				return(substr($line,0,-2));			}		}	}		function sock_send($socket, $str = "") {		//echo "C:> " . $str . "<br />";		return fputs($socket, $str . "\r\n");	}		function gerarTag() {		return sprintf("A%04d", rand(0, 9999));	}		function echobr($str = "") {		echo $str . "<BR />";	}		require_once("imapDir.class.php");	//Autenticar	$imap["usuario"]	= "usuario@servidor.com.br";	$imap["senha"]		= "senha";	$imap["servidor"]	= "servidor.com.br";	$imap["porta"]		= "143";	$socket = fsockopen($imap["servidor"], $imap["porta"], $errno, $errstr);	$resposta = sock_recv($socket);	sock_send($socket, gerarTag() . " LOGIN " . $imap["usuario"] . " " . $imap["senha"]);	$resposta = sock_recv($socket);	//echo $resposta; // Para ver se a autenticação ta firmando		$novoDiretorio = "INBOX.imasters";		//Aqui começa o duelo ^^	$imapDir = new imapDir($socket);		//Lista os diretórios atuais	echobr("");	if($diretorios = $imapDir->listarDir()) {		echobr(count($diretorios) . " Diretórios");		foreach($diretorios as $diretorio) {			echobr("     - " . $diretorio);		}	} else {		echobr("Não foi possivel listar os diretório");	}		//Cria um diretório com a variavel $novoDiretorio	echobr("");	if($imapDir->criarDir($novoDiretorio)) {		echobr("Diretório " . $novoDiretorio . " criado.");	} else {		echobr("Não foi possivel criar o diretório");	}		//Lista novamente os diretórios	echobr("");	if($diretorios = $imapDir->listarDir()) {		echobr(count($diretorios) . " Diretórios");		foreach($diretorios as $diretorio) {			echobr("     - " . $diretorio);		}	} else {		echobr("Não foi possivel listar os diretório");	}		//Renomeia o diretório	echobr("");	if($imapDir->renomearDir($novoDiretorio, "INBOX.MeuDirRenomeado")) {		echobr("Diretório " . $novoDiretorio . " renomeado para MeuDirRenomeado");	} else {		echobr("Não foi possivel renomear o diretório " . $novoDiretorio);	}		//Lista novamente os diretórios	echobr("");	if($diretorios = $imapDir->listarDir()) {		echobr(count($diretorios) . " Diretórios");		foreach($diretorios as $diretorio) {			echobr("     - " . $diretorio);		}	} else {		echobr("Não foi possivel listar os diretório");	}	//Remove o diretório criado anteriormente	echobr("");	if($imapDir->removerDir("INBOX.MeuDirRenomeado")) {		echobr("Diretório " . $novoDiretorio . " removido.");	} else {		echobr("Não foi possivel remover o diretório");	}		//Lista novamente os diretórios	echobr("");	if($diretorios = $imapDir->listarDir()) {		echobr(count($diretorios) . " Diretórios");		foreach($diretorios as $diretorio) {			echobr("     - " . $diretorio);		}	} else {		echobr("Não foi possivel listar os diretório");	}?>

testado no Courier-IMAP 3.0.7

 

Problemas atuais:

- Incompatibilidade com servidores que usam delimitadores diferente de "."

- Não validação de "paths" completos, ex: "meu_dir" ao invez de "INBOX.meu_dir"

 

segue o RFC do IMAPv4

http://www.isi.edu/in-notes/rfc3501.txt

 

ta na mão ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

brother. que desafio cara!!!

 

Mas ow, ta ai minha versão da classe:

 

<?phpclass imapDir {	var $imapConexao;	var $resposta;	var $status;	/*	Lista de Status:	1 - Conectado	2 - Logado	3 - Desconectado	*/	// Construtor da classe	function __construct($servidor, $porta) {		if(empty($servidor) || empty($porta)) {			echo "\n<br />Você deve definir uma host para conexão e uma porta!";			return false;		}		$this->imapConexao = @fsockopen($servidor, $porta, $n_erro, $msg_erro);		if(!$this->imapConexao) {			echo sprintf("\n<br />Não foi possivel abrir a conexão! Erro: %s (%d)", $msg_erro, $n_erro);			return false;		}		$this->resposta = $this->resposta_servidor();		$this->status = 1;		return true;	}		function __destruct() {		if ($this->status == 2) $this->logout();		@fclose($this->imapConexao);		$this->imapConexao = NULL;		$this->status = 3;		return true;	}		private function resposta_servidor() {		while (true) {			$linha = "";			while (!feof($this->imapConexao)) {				$linha .= fgets($this->imapConexao);				if (strlen($linha) >= 2 && substr($linha, -2) == "\r\n") return(substr($linha, 0, -2));			}			if (substr($linha, strpos($linha, $this->tag), strlen($this->tag)) == $this->tag)				break;		}		return $linha;	}			private function enviar_comando($comando) {		return @fputs($this->imapConexao, sprintf("%s\r\n", $comando));	}		function login($usuario, $senha) {		$this->tag = sprintf("A%04d", rand(0, 9999));		if ($this->status == 2) {			echo "\n<br />Você já esta logado no sistema!";			return false;		}		else if ($this->status == 1) {			if($this->enviar_comando(sprintf("%s LOGIN %s %s", $this->tag, $usuario, $senha))) {				$this->resposta = $this->resposta_servidor();				if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $this->tag)) + strlen($this->tag) + 1, 2) != "OK") {					echo sprintf("\n<br />Não foi possivel efetuar login! Erro: %s", $this->resposta);					return false;				}			}			else {				echo "Ocorreu um erro ao enviar o comando para o servidor!";				return false;			}			$this->status = 2;			return true;		}	}		function logout() {		$this->tag = sprintf("A%04d", rand(0, 9999));		if($this->status != 2) {			echo "\n<br />E preciso estar logado para chamar esta funcao!";			return false;		}		if($this->enviar_comando(sprintf("%s LOGOUT", $this->tag))) {			$this->resposta = $this->resposta_servidor();			$this->resposta = $this->resposta_servidor();			if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $this->tag)) + strlen($this->tag) + 1, 2) != "OK") {				echo sprintf("\n<br />Ocorreu um erro ao efetuar logout! Erro: %s", $this->resposta);				return false;			}		}		else {			echo "Ocorreu um erro ao enviar o comando para o servidor!";			return false;		}		$this->status = 1;		return true;	}		/*	function listarDir() {		$tag = gerarTag();		sock_send($this->imapConexao, $tag . " LIST INBOX *");		$resposta = sock_recv($this->imapConexao);		if(substr($resposta, strlen(gerarTag()) + 1, 2) == "NO") return FALSE;		$diretorios = array();		while(substr($resposta, strlen(gerarTag()) + 1, 2) != "OK") {			$diretorios[] = substr($resposta, strpos($resposta, "INBOX"), strlen($resposta) - strpos("INBOX", $resposta) - 30);			$resposta = sock_recv($this->imapConexao);		}		return $diretorios;	}	*/		function listarDir ($mailbox = "INBOX", $coringa = "*") {		$tag = sprintf("A%04d", rand(0, 9999));		if ($this->status != 2) {			echo "\n<br />Erro: Você precisa estar logado para listar os diretorios!";			return false;		}				if($this->enviar_comando(sprintf("%s LIST \"%s\" \"%s\"", $tag, $mailbox, $coringa))) {			$this->resposta = $this->resposta_servidor();			$diretorios = array();			while(substr($this->resposta, strlen($tag) + 1, 2) != "OK") {				$diretorios[] = substr($this->resposta, strpos($this->resposta, "INBOX"), strlen($this->resposta) - strpos("INBOX", $this->resposta) - 30);				$resposta = $this->resposta_servidor();			}			return $diretorios;		}		else {			echo "Ocorreu um erro ao enviar o comando para o servidor!";			return false;		}			}		function criarDir($dir) {		$tag = sprintf("A%04d", rand(0, 9999));		if ($this->status != 2) {			echo "\n<br />Erro: Você precisa estar logado para criar um diretorio!";			return false;		}		if (empty($dir)) {			echo "\n<br />Erro: Você precisa especificar um diretorio a ser criado!";			return false;		}		if ($this->enviar_comando(sprintf("%s CREATE INBOX.%s", $tag, $dir))) {			$this->resposta = $this->resposta_servidor();			if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $this->tag)) + strlen($this->tag) + 1, 2) != "OK") {				echo sprintf("\n<br />Ocorreu um erro ao criar um diretorio! Erro: %s", $this->resposta);				return false;			}			else return true;		}		else {			echo "Ocorreu um erro ao enviar o comando para o servidor!";			return false;		}	}		function removerDir($dir) {		$tag = sprintf("A%04d", rand(0, 9999));		if ($this->status != 2) {			echo "\n<br />Erro: Você precisa estar logado para remover um diretorio!";			return false;		}		if (empty($dir)) {			echo "\n<br />Erro: Você precisa especificar um diretorio a ser removido!";			return false;		}		if ($this->enviar_comando(sprintf("%s DELETE INBOX.%s", $tag, $dir))) {			$this->resposta = $this->resposta_servidor();			if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $this->tag)) + strlen($this->tag) + 1, 2) != "OK") {				echo sprintf("\n<br />Ocorreu um erro ao remover o diretorio! Erro: %s", $this->resposta);				return false;			}			else return true;		}		else {			echo "Ocorreu um erro ao enviar o comando para o servidor!";			return false;		}	}		function renomearDir($dir, $novoDir) {		$tag = sprintf("A%04d", rand(0, 9999));		if ($this->status != 2) {			echo "\n<br />Erro: Você precisa estar logado para renomear um diretorio!";			return false;		}		if (empty($dir) || empty($novoDir)) {			echo "\n<br />Erro: Você precisa especificar um diretorio a ser renomeado e o novo nome deste diretorio!";			return false;		}		if ($this->enviar_comando(sprintf("%s RENAME INBOX.%s INBOX.%s", $tag, $dir, $novoDir))) {			$this->resposta = $this->resposta_servidor();			if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $this->tag)) + strlen($this->tag) + 1, 2) != "OK") {				echo sprintf("\n<br />Ocorreu um erro ao renomear o diretorio! Erro: %s", $this->resposta);				return false;			}			else return true;		}		else {			echo "Ocorreu um erro ao enviar o comando para o servidor!";			return false;		}	}}?>

 

 

meu arquivo de teste:

 

<?phprequire_once("imapDir.class.php");$imap = new imapDir("localhost", 143);echo $imap->resposta . "<br />";$imap->login("teste", "teste");echo $imap->resposta . "<br />";/*if($diretorios = $imap->listarDir()) {	echo sprintf("\n<br />%d Diretórios", count($diretorios));	foreach($diretorios as $diretorio) {		echo sprintf("\n<br /> - %s", $diretorio);	}}*/$imap->criarDir("teste");echo $imap->resposta . "<br />";$imap->renomearDir("teste", "diego");echo $imap->resposta . "<br />";$imap->removerDir("diego");echo $imap->resposta . "<br />";$imap->logout();echo $imap->resposta . "<br />";?>

 

 

 

Problemas que eu não solucionei:

- não consegui nem f****** melhorar o metodo de listar diretorios, alias, piorei porque agora não funciona. rsrs

- como eu não sou um expert em oop não sei se usei os construtores e destrutores corretamente, mas ficou legal do meu ponto de vista

 

 

Ow, acho que eu não corrigi nenhum dos bug's que você relatou, eu apenas melhorei mesmo o que tinha.

Ainda preciso estudar mais o imap pra poder ter uma noção melhor de como funciona direitinho.

 

esse desafio vai longe cara, tem muita coisa a ser feita.

 

edit: duas observações que eu esqueci:

1 - não comentei muito o codigo, acabei fazendo isso pela madrugada a fora e agora de manhã só dei uma olhada por cima

2 - basicamente eu só reescrevi sua classe, não fiz nada radical revolucionario

 

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

=) diego, não seu se suas mudanças foram válidas =(aqui vai o meu pq: voce alterou com um contrutor e um destrutor, ficando restrito ao php5, o que não acho válido, ja que a idéia de qualquer código é portabilidade voce refez as funções login, enviar_comando, resposta_servidor, colocando algumas coisas como $var = "", ou sprintf e trocando nome das variaveis e as colocou dentro da classe, ja que a idéia da classe é manipular diretórios. Imagine nossa classe, de manipulação de diretorios, e uma de manipular mensagen. No script onde fará a união das classes o programador terá que fazer 2 conexões, não tb naum acho valido.bem, não sou a pessoa certa pra dizer se é válido ou não, mas gostaria que os "jurados" opinassem nestanada pessoal em diego, por favor ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

fica tranquilo brother, eu não vou levar nada pro lado pessoal não. alias, fico muito satisfeito de você e outros caras fazerem criticas positivas como esta, eu sou um aprendiz, então o que vier pra melhorar eu aceito.sobre a classe, como eu disse eu não mudei nada demais.sobre o esquema da conexão e do login dentro da classe, o que eu tinha pensado a respeito disso é o sequinte: essa classe de manipular diretorios poderia ser uma extensão de uma classe imap mais completa. ai dentro desta classe imap mais completa viria o login e a conexão.sobre portabilidade, eu realmente estou restrito a php5 porque a muito eu só uso ele, mas vou tentar pensar em um aspecto mais geral da proxima.e vamos seguir com isso cara, ate essa classe ficar show de bola. eu sinceramente não to preocupado em perder ou ganhar, to querendo brincar e aprender. rsabraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

POWWWW diego, é claro que a idéia é se divertir ^^

http://forum.imasters.com.br/public/style_emoticons/default/worshippy.gif http://forum.imasters.com.br/public/style_emoticons/default/worshippy.gif http://forum.imasters.com.br/public/style_emoticons/default/worshippy.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

bem, isso significa a validade do código, certo? ok ^^sem "pobrema" ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

diego, e como vai ficar as funções de enviar e receber respostas do servidor?e de coneção, login, e talja que a classe naum tem esse fim

Compartilhar este post


Link para o post
Compartilhar em outros sites

só especulando, mas ficaria mais ou menos assim:

 

class imap {	   function conectar();	   function login();	   enviar_comando();	   receber_resposta();}class imapDir extends imap {	   function listarDir();	   function criarDir();	   function removerDir();	   function renomearDir();}

 

isso é só um desenho feito de cabeça aqui, mas a minha intenção é essa, ter uma classe base e extende-la. assim se for preciso criar metodos para qualquer outra coisa basta extender a classe principal e ir adicionando os metodos novos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, apesar de não concordar com algumas mudanças, tais como os nomes das funções, e os echos, mesmo que para debug (ja que um debug no enviar comando e receber comando ja seria o suficiente para teste), fiz

 

- Achar o delimitador de diretórios no método login

- Fazer os métodos trabalharem com o delimitador nativo do servidor, e não sómento o "."

- O método comando_validacao($tag), que espera uma confirmação do comando, como por exemplo, o LOGOUT, que não faz o servidor responder o padrão como "TAG OK command completed", mas sim, um "* BYE BYE" e depois a confirmação o comando. Assim com ele pode-se aguardar, para esperar se o comando foi aceito.

- Algumas $tag era globais, fiz tudo ficar logal

 

DUVIDAS

- Pq o $this->resposta como global?

- Para que a variavel de estado, se ao executar um comando, se naum tiver conectado, ira ser retornado false do mesmo modo, ou se for efetuado um comando sem estar logado, o servidor retornará falha, e a classe tb retornará false. ps: só vi isso na classe imap.class.php (http://www.koders.com/php/fidE612755334515FEE34E2EB26B205A8A907AA9EF4.aspx) ^^

 

bem, ai vai a classe modificada

<?phpclass imapDir {	var $imapConexao;	var $resposta;	var $status;	var $delimitador;	/*	Lista de Status:	1 - Conectado	2 - Logado	3 - Desconectado	*/	// Construtor da classe	function __construct($servidor, $porta) {		if(empty($servidor) || empty($porta)) {			return false;		}		$this->imapConexao = @fsockopen($servidor, $porta, $n_erro, $msg_erro);		if(!$this->imapConexao) {			return false;		}		$this->resposta = $this->resposta_servidor();		$this->status = 1;		return true;	}		function __destruct() {		if ($this->status == 2) $this->logout();		@fclose($this->imapConexao);		$this->imapConexao = NULL;		$this->status = 3;		return true;	}		function comando_validacao($tag) {		$this->resposta = $this->resposta_servidor();		if(substr($this->resposta, 0, strlen($tag)) == $tag) {			return True;		} else {			$this->comando_validacao($tag);		}	}		private function resposta_servidor() {		while (true) {			$linha = "";			while (!feof($this->imapConexao)) {				$linha .= fgets($this->imapConexao);				if (strlen($linha) >= 2 && substr($linha, -2) == "\r\n") return(substr($linha, 0, -2));			}			if (substr($linha, strpos($linha, $tag), strlen($tag)) == $tag)				break;		}		return $linha;	}			private function enviar_comando($comando) {		return @fputs($this->imapConexao, sprintf("%s\r\n", $comando));	}		function login($usuario, $senha) {		$tag = sprintf("A%04d", rand(0, 9999));		if ($this->status == 2) {			return false;		}		else if ($this->status == 1) {			if($this->enviar_comando(sprintf("%s LOGIN %s %s", $tag, $usuario, $senha))) {				$this->resposta = $this->resposta_servidor();				if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $tag)) + strlen($tag) + 1, 2) != "OK") {					return false;				}			}			else {				return false;			}			$this->status = 2;						// Procura o delimitador			$tag = sprintf("A%04d", rand(0, 9999));			if($this->enviar_comando(sprintf("%s LIST \"\" \"\"", $tag))) {				$this->resposta = $this->resposta_servidor();				$aux = explode(" ", $this->resposta);				$this->delimitador = str_replace("\"", "", $aux[3]); 			}			else {				echo "Ocorreu um erro ao enviar o comando para o servidor!";				return false;			}						return true;		}	}		function logout() {		$tag = sprintf("A%04d", rand(0, 9999));		if($this->status != 2) {			return false;		}		if($this->enviar_comando(sprintf("%s LOGOUT", $tag))) {			if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $tag)) + strlen($tag) + 1, 2) != "OK") {				return false;			}		}		else {			return false;		}		$this->status = 1;		return true;	}		/*	function listarDir() {		$tag = gerarTag();		sock_send($this->imapConexao, $tag . " LIST INBOX *");		$resposta = sock_recv($this->imapConexao);		if(substr($resposta, strlen(gerarTag()) + 1, 2) == "NO") return FALSE;		$diretorios = array();		while(substr($resposta, strlen(gerarTag()) + 1, 2) != "OK") {			$diretorios[] = substr($resposta, strpos($resposta, "INBOX"), strlen($resposta) - strpos("INBOX", $resposta) - 30);			$resposta = sock_recv($this->imapConexao);		}		return $diretorios;	}	*/		function listarDir ($mailbox = "INBOX", $coringa = "*") {		$tag = sprintf("A%04d", rand(0, 9999));		if ($this->status != 2) {			return false;		}				if($this->enviar_comando(sprintf("%s LIST \"%s\" \"%s\"", $tag, $mailbox, $coringa))) {			$this->resposta = $this->resposta_servidor();			$diretorios = array();			while(substr($this->resposta, strlen($tag) + 1, 2) != "OK") {				$diretorios[] = substr($this->resposta, strpos($this->resposta, "INBOX"), strlen($this->resposta) - strpos("INBOX", $this->resposta) - 30);				$resposta = $this->resposta_servidor();			}			return $diretorios;		}		else {			return false;		}			}		function criarDir($dir) {		$tag = sprintf("A%04d", rand(0, 9999));		if ($this->status != 2) {			return false;		}		if (empty($dir)) {			return false;		}		if ($this->enviar_comando(sprintf("%s CREATE INBOX%s", $tag, $this->delimitador.$dir))) {			$this->resposta = $this->resposta_servidor();			if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $tag)) + strlen($tag) + 1, 2) != "OK") {				return false;			}			else return true;		}		else {			return false;		}	}		function removerDir($dir) {		$tag = sprintf("A%04d", rand(0, 9999));		if ($this->status != 2) {			return false;		}		if (empty($dir)) {			return false;		}		if ($this->enviar_comando(sprintf("%s DELETE INBOX%s", $tag, $this->delimitador.$dir))) {			$this->resposta = $this->resposta_servidor();			if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $tag)) + strlen($tag) + 1, 2) != "OK") {				return false;			}			else return true;		}		else {			return false;		}	}		function renomearDir($dir, $novoDir) {		$tag = sprintf("A%04d", rand(0, 9999));		if ($this->status != 2) {			return false;		}		if (empty($dir) || empty($novoDir)) {			return false;		}		if ($this->enviar_comando(sprintf("%s RENAME INBOX%s INBOX%s", $tag, $this->delimitador.$dir, $this->delimitador.$novoDir))) {			$this->resposta = $this->resposta_servidor();			if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $tag)) + strlen($tag) + 1, 2) != "OK") {				return false;			}			else return true;		}		else {			return false;		}	}}?>

teste

<?phprequire_once("imapDir.class.php");$imap = new imapDir("servidor.com.br", 143);$imap->login("usuario@servidor", "senha");/*if($diretorios = $imap->listarDir()) {	echo sprintf("\n<br />%d Diretórios", count($diretorios));	foreach($diretorios as $diretorio) {		echo sprintf("\n<br /> - %s", $diretorio);	}}*/if($imap->criarDir("teste"))	echo "Diretórios criado<br>";else	echo "Diretórios não criado<br>";if($imap->renomearDir("teste", "diego"))	echo "Diretório renomeado<br>";else	echo "Diretório não renomeado<br>";	if($imap->removerDir("diego"))	echo "Diretório removido<br>";else	echo "Diretório não removido<br>";if($imap->logout())	echo "Logout<br>";else	echo "Erro ao sair<br>";?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

DUVIDAS- Pq o $this->resposta como global?- Para que a variavel de estado, se ao executar um comando, se naum tiver conectado, ira ser retornado false do mesmo modo, ou se for efetuado um comando sem estar logado, o servidor retornará falha, e a classe tb retornará false. ps: só vi isso na classe imap.class.php (http://www.koders.com/php/fidE612755334515FEE34E2EB26B205A8A907AA9EF4.aspx) ^^

- na verdade eu só deixei ela pra mim ecoar na tela o que tava rolando junto com mensagens da classe- a variavel de estado eu realmente me influenciei eum uma classe, não olhei a sua mas acredito que seja semelhante. eu acho intessante deixar porque sob meu ponto de vista é muito melhor você chegar o status de algo antes de ficar fazendo tentativas frustadas e esperando o sistema retornar erros e falhas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

diego, vou dar um exmplose o usuario naum logar para criar um diretório

if ($this->enviar_comando(sprintf("%s CREATE INBOX%s", $tag, $this->delimitador.$dir))) {			$this->resposta = $this->resposta_servidor();			if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $tag)) + strlen($tag) + 1, 2) != "OK") {				// ELE NAUM VAI RETORNAR UM OK, LOGO ENTRARÁ AQUI E IRÁ RETORNAR FALSE				return false;			}			else return true;		}		else {			return false;		}
não é uma falha, é o que o protoloco proporciona. nunca vi, mas pensa em uma autenticação confiavel, onde o IP já da a garantia ao servidor, e já loga o usuario. A classe não funcionará, pois eu naum dei o "LOGIN"captcou?isso é só um exemplo, mas consigo ver varios do tipo, principalmente em redes que usam LDAP (você ja deve ter visto) que após autenticar no LDAP, os outros servidores confiam no IP ou na sessão que autenticou no LDAP.EDITADOe para o debug, é mais facil fazer isso

private function resposta_servidor() { while (true) { $linha = ""; while (!feof($this->imapConexao)) { $linha .= fgets($this->imapConexao); if (strlen($linha) >= 2 && substr($linha, -2) == "\r\n") return(substr($linha, 0, -2)); } if (substr($linha, strpos($linha, $tag), strlen($tag)) == $tag) break; } echo "S: " . $linha . "<br>"; return $linha; } private function enviar_comando($comando) { echo "C: " . $comando . "<br>"; return @fputs($this->imapConexao, sprintf("%s\r\n", $comando)); }

assim da pra ver como ta manipulando o protocolo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Scorn e Diego, se vocês discordam de algum ponto, não precisam, necessariamente, trabalhar no mesmo código. Cada um faz melhorias em cima da própria classe. No final, avaliamos qual delas é melhor.

na verdade eu não estou discordando, eu apenas contestei, mas como ele me provou que a forma dele é melhor eu aceito sem problemas. hehehehecomo diz um professor meu: topo seguir em qualquer caminho, desde que seja para frente.e outra, aprendi mais uma coisa sobre esse protocolo. rsdeixa eu ir trabalhar aqui nas minhas melhorias. hehehe

Compartilhar este post


Link para o post
Compartilhar em outros sites

^^o duro destes duelos, eh que chega uma hora que a classe vai estar perfeita, dai um tem que desistir AUEhAUheUAHe =/ putzé tenso esses duelos ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

^^o duro destes duelos, eh que chega uma hora que a classe vai estar perfeita, dai um tem que desistir AUEhAUheUAHe =/ putzé tenso esses duelos ^^

é verdade. sua classe ta muito boa cara. to aqui vendo aonde posso melhorar. hehehe

Compartilhar este post


Link para o post
Compartilhar em outros sites

Minhas mudanças:

- na listagem de diretorios o diretorio principal sempre estará em primeiro lugar

- nas operações de criar, apagar e renomear eu fiz uma verificação de segurança pra verificar se o diretorio existe

- a tag para a operação será global e incrementada antes de qualquer operação. assim em log's fica mais tranquilo definir a ordem das operações por exemplo.

 

 

Brother, eu acho que a classe é basicamente isso. acho que agora o que sobra fazer é melhorar e otimizar o que já existe.

Ah, se tiver alguma coisa na classe que você ache desnecessario pode apagar, de boa.

Outra coisa, eu to meio sem tempo por causa da facul, mas uma coisa que eu acho que pode ser feito pra melhorar a classe é aplicar mais expressões regulares. fica ai uma ideia.

 

ai vai a classe:

 

<?phpclass imapDir {	var $imapConexao, $resposta, $tag, $status, $delimitador;	/*	 Lista de Status:	 1 - Conectado	 2 - Logado	 3 - Desconectado	 */	function __construct($servidor, $porta) {		if(empty($servidor) || empty($porta)) {			return false;		}		$this->imapConexao = @fsockopen($servidor, $porta, $n_erro, $msg_erro);		if(!$this->imapConexao) {			return false;		}		$this->resposta = $this->resposta_servidor();		$this->status = 1;		$this->tag = "A0000";		return true;	}	function __destruct() {		if ($this->status == 2) $this->logout();		@fclose($this->imapConexao);		$this->imapConexao = NULL;		$this->status = 3;		return true;	}	private function comando_validacao($tag) {		$this->resposta = $this->resposta_servidor();		if(substr($this->resposta, 0, strlen($tag)) == $tag) {			return true;		} else {			$this->comando_validacao($tag);		}	}	private function resposta_servidor() {		while (true) {			$linha = "";			while (!feof($this->imapConexao)) {				$linha .= fgets($this->imapConexao);				if (strlen($linha) >= 2 && substr($linha, -2) == "\r\n") return(substr($linha, 0, -2));			}			if (substr($linha, strpos($linha, $this->tag), strlen($this->tag)) == $this->tag)			break;		}		return $linha;	}	private function enviar_comando($comando) {		return @fputs($this->imapConexao, sprintf("%s\r\n", $comando));	}	function login($usuario, $senha) {		if ($this->status == 2) {			return false;		}		else if ($this->status == 1) {			$this->tag++;			if($this->enviar_comando(sprintf("%s LOGIN %s %s", $this->tag, $usuario, $senha))) {				$this->resposta = $this->resposta_servidor();				if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $this->tag)) + strlen($this->tag) + 1, 2) != "OK") {					return false;				}			}			else {				return false;			}			$this->status = 2;			// Procura o delimitador			$this->tag++;			if($this->enviar_comando(sprintf("%s LIST \"\" \"\"", $this->tag))) {				$this->resposta = $this->resposta_servidor();				while(substr($this->resposta, strlen($this->tag) + 1, 2) != "OK") {					$aux = explode(" ", $this->resposta);					$this->delimitador = str_replace("\"", "", $aux[3]);					$this->resposta = $this->resposta_servidor();				}			}			else {				echo "Ocorreu um erro ao enviar o comando para o servidor!";				return false;			}			return true;		}	}	function logout() {		if($this->status != 2) {			return false;		}		$this->tag++;		if($this->enviar_comando(sprintf("%s LOGOUT", $this->tag))) {			$this->comando_validacao($this->tag);			if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $this->tag)) + strlen($this->tag) + 1, 2) != "OK") {				return false;			}		}		else {			return false;		}		$this->status = 1;		return true;	}	function listarDir () {		if ($this->status != 2) {			return false;		}		// if($this->enviar_comando(sprintf("%s LIST \"%s\" \"%s\"", $this->tag, $mailbox, $coringa))) {		$this->tag++;		if ($this->enviar_comando(sprintf("%s LIST \"\" \"*\"", $this->tag))) {			$this->resposta = $this->resposta_servidor();			$diretorios = array();			while(substr($this->resposta, strlen($this->tag) + 1, 2) != "OK") {				ereg("\(([^/]*)\)", $this->resposta, $tipo_tmp);				ereg("\"([^/]*)\"", $this->resposta, $dir);				$tipo = explode(" ", preg_replace("/(\(|\))/", "", $tipo_tmp[0]));				for ($i = 0; $i < count($tipo); $i++) {					if ($tipo[$i] == "\HasChildren") $principal = true;				}				if (isset($principal) && $principal == true) {					array_unshift($diretorios, preg_replace("/(\".\"|\")/", "", $dir[0]));					unset($principal);				}				else $diretorios[] = preg_replace("/(\".\"|\")/", "", $dir[0]);				$this->resposta = $this->resposta_servidor();			}			return $diretorios;		}		else {			return false;		}	}	function criarDir($novo_diretorio) {		if ($this->status != 2) {			return false;		}		if (empty($novo_diretorio)) {			return false;		}		$this->tag++;		if ($this->enviar_comando(sprintf("%s LIST \"\" \"*\"", $this->tag))) {			$this->resposta = $this->resposta_servidor();			$diretorios = array();			while(substr($this->resposta, strlen($this->tag) + 1, 2) != "OK") {				ereg("\(([^/]*)\)", $this->resposta, $tipo_tmp);				ereg("\"([^/]*)\"", $this->resposta, $dir);				$tipo = explode(" ", preg_replace("/(\(|\))/", "", $tipo_tmp[0]));				for ($i = 0; $i < count($tipo); $i++) {					if ($tipo[$i] == "\HasChildren") $principal = true;				}				if (isset($principal) && $principal == true) {					array_unshift($diretorios, preg_replace("/(\".\"|\")/", "", $dir[0]));					unset($principal);				}				else $diretorios[] = preg_replace("/(\".\"|\")/", "", $dir[0]);				$this->resposta = $this->resposta_servidor();			}			for ($i = 0; $i < count($diretorios); $i++) {				if ($diretorios[$i] == $diretorios[0].$this->delimitador.$novo_diretorio) {					break;					return false;				}			}		}		$this->tag++;		if ($this->enviar_comando(sprintf("%s CREATE %s", $this->tag, $diretorios[0].$this->delimitador.$novo_diretorio))) {			$this->resposta = $this->resposta_servidor();			if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $this->tag)) + strlen($this->tag) + 1, 2) != "OK") {				return false;			}			else return true;		}		else {			return false;		}	}	function removerDir($dir) {		if ($this->status != 2) {			return false;		}		if (empty($dir)) {			return false;		}		$this->tag++;		if ($this->enviar_comando(sprintf("%s LIST \"\" \"*\"", $this->tag))) {			$this->resposta = $this->resposta_servidor();			$diretorios = array();			while(substr($this->resposta, strlen($this->tag) + 1, 2) != "OK") {				ereg("\(([^/]*)\)", $this->resposta, $tipo_tmp);				ereg("\"([^/]*)\"", $this->resposta, $diretorio);				$tipo = explode(" ", preg_replace("/(\(|\))/", "", $tipo_tmp[0]));				for ($i = 0; $i < count($tipo); $i++) {					if ($tipo[$i] == "\HasChildren") $principal = true;				}				if (isset($principal) && $principal == true) {					array_unshift($diretorios, preg_replace("/(\".\"|\")/", "", $diretorio[0]));					unset($principal);				}				else $diretorios[] = preg_replace("/(\".\"|\")/", "", $diretorio[0]);				$this->resposta = $this->resposta_servidor();			}			for ($i = 0; $i < count($diretorios); $i++) {				if ($diretorios[$i] == $diretorios[0].$this->delimitador.$dir) {					$dir_existe = true;				}			}		}		if(isset($dir_existe) && $dir_existe = true) {			$this->tag++;			if ($this->enviar_comando(sprintf("%s DELETE INBOX%s", $this->tag, $this->delimitador.$dir))) {				$this->resposta = $this->resposta_servidor();				if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $this->tag)) + strlen($this->tag) + 1, 2) != "OK") {					return false;				}				else return true;			}			else {				return false;			}		}	}	function renomearDir($dir, $novoDir) {		if ($this->status != 2) {			return false;		}		if (empty($dir) || empty($novoDir)) {			return false;		}		$this->tag++;		if ($this->enviar_comando(sprintf("%s LIST \"\" \"*\"", $this->tag))) {			$this->resposta = $this->resposta_servidor();			$diretorios = array();			while(substr($this->resposta, strlen($this->tag) + 1, 2) != "OK") {				ereg("\(([^/]*)\)", $this->resposta, $tipo_tmp);				ereg("\"([^/]*)\"", $this->resposta, $diretorio);				$tipo = explode(" ", preg_replace("/(\(|\))/", "", $tipo_tmp[0]));				for ($i = 0; $i < count($tipo); $i++) {					if ($tipo[$i] == "\HasChildren") $principal = true;				}				if (isset($principal) && $principal == true) {					array_unshift($diretorios, preg_replace("/(\".\"|\")/", "", $diretorio[0]));					unset($principal);				}				else $diretorios[] = preg_replace("/(\".\"|\")/", "", $diretorio[0]);				$this->resposta = $this->resposta_servidor();			}			for ($i = 0; $i < count($diretorios); $i++) {				if ($diretorios[$i] == $diretorios[0].$this->delimitador.$dir) {					$dir_existe = true;				}				if ($diretorios[$i] == $diretorios[0].$this->delimitador.$novo_dir) {					break;					return false;				}			}		}		if(isset($dir_existe) && $dir_existe = true) {			$this->tag++;			if ($this->enviar_comando(sprintf("%s RENAME %s %s", $this->tag, $diretorios[0].$this->delimitador.$dir, $diretorios[0].$this->delimitador.$novoDir))) {				$this->resposta = $this->resposta_servidor();				if(substr($this->resposta, strpos($this->resposta, sprintf("%s", $this->tag)) + strlen($this->tag) + 1, 2) != "OK") {					return false;				}				else return true;			}			else {				return false;			}		}	}}?>

 

arquivo de teste:

 

<?phprequire_once("imapDir.class.php5");$imap = new imapDir("localhost", 143);$imap->login("diego", "teste");$diretorios = $imap->listarDir();if ($diretorios == false) echo "erro ao listar os diretorios<br />";else {	echo sprintf("%d Diretórios<br />\n", count($diretorios));	foreach($diretorios as $diretorio) {		echo sprintf("- %s<br />\n", $diretorio);	}}if($imap->criarDir("teste")) echo "Diretório criado<br>";else echo "Diretório não criado<br />\n";$diretorios = $imap->listarDir();if ($diretorios == false) echo "erro ao listar os diretorios<br />";else {	echo sprintf("%d Diretórios<br />\n", count($diretorios));	foreach($diretorios as $diretorio) {		echo sprintf("- %s<br />\n", $diretorio);	}}if($imap->criarDir("teste")) echo "Diretório criado<br />\n";else echo "Diretório não criado<br />\n";if($imap->renomearDir("teste", "diego")) echo "Diretório renomeado<br />\n";else echo "Diretório não renomeado<br />\n";	if($imap->removerDir("diego")) echo "Diretório removido<br />\n";else echo "Diretório não removido<br />\n";if($imap->logout()) echo "Logout<br />\n";else echo "Erro ao sair<br />\n";?>

 

no mais, abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

bem, pra variar, eu acho que com essa classe assim, a gente naum ta usando o poder do protocolo IMAP

 

por exemplo, validar se o diretório existe, só vai fazer aumentar o consumo de banda, ja que o protocolo ja se assegura disso, retornando o erro.

 

outra coisa, acho que não é preciso ER usando protocolo IMAP, pois ele segue um padrão muito bom nas respostas,

 

[*] (OK|BAD|NO) msg

 

onde [] é opcional

() é um ou outro

msg, é obrigatório.

 

amanha, volto a trampar ='(

vou fazer algumas mudanças, usando mais o que o IMAP nos dá, inclusive, vou tirar estas validações, a variavel de estado, que esta deixando a classe mais lenta, ja que estamos validando a mesma coisas 2 ou até 3 vezes.

 

não sei se é contra as regras dizer o que vou fazer, mas postei pq talvez me me faça mudar de idéia e naum tirar as validações e a variavel de estado.

 

=)

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

nossa, UAehUAHeuAHe olha isso

erro ao listar os diretoriosDiretório não criadoerro ao listar os diretoriosDiretório não criadoDiretório não renomeadoDiretório não removidoErro ao sair

uAHEuAHeuhae deve ser problema no meu servidor uAHEUAHeuAHEimagina o desespero ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

bem, pra variar, eu acho que com essa classe assim, a gente naum ta usando o poder do protocolo IMAP

 

por exemplo, validar se o diretório existe, só vai fazer aumentar o consumo de banda, ja que o protocolo ja se assegura disso, retornando o erro.

 

outra coisa, acho que não é preciso ER usando protocolo IMAP, pois ele segue um padrão muito bom nas respostas,

 

[*] (OK|BAD|NO) msg

 

onde [] é opcional

() é um ou outro

msg, é obrigatório.

 

amanha, volto a trampar ='(

vou fazer algumas mudanças, usando mais o que o IMAP nos dá, inclusive, vou tirar estas validações, a variavel de estado, que esta deixando a classe mais lenta, ja que estamos validando a mesma coisas 2 ou até 3 vezes.

 

não sei se é contra as regras dizer o que vou fazer, mas postei pq talvez me me faça mudar de idéia e naum tirar as validações e a variavel de estado.

 

=)

 

[]'s

As regras somos nós que criamos cara. hehehehehe

 

manda ver lá. to esperando...

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.