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

daee, entaum, mudei algumas coisas:

- Remoção da variavel status, deixando o protocolo me dizer qual o meu estado dentro do servidor

- Remoção das verificações de existencia de diretório, deixando o protocolo me dizer se foi possivel a remoção ou não

- Generalização do INBOX

 

Em alguns casos raros, o usuário pode trocar o nome inbox, para qualquer outro ou ainda usar o diretório raiz no sistema, logo fiz ele ser genérico, você pode usar, tanto o INBOX quando outra coisa, por exmeplo

 

$imap->criarDir("INBOX.teste")
ou

$imap->criarDir("teste")
ambos são iguais.

ou ainda,

 

$imap->criarDir("entrada.teste")
em casos raros

 

outra coisa, é que isso possibilida a criação de diretórios recursivos

 

$imap->criarDir("INBOX.teste1")$imap->criarDir("INBOX.teste1.teste2")
logo, o método listarDir não confere, pois com isso

if ($tipo[$i] == "\HasChildren") $principal = true;
você faz, no meu exemplo, o "INBOX.teste1" ser o diretório principal, e não mais o "INBOX"

 

- remoção, criação, e renomeação com ou sem o "INBOX", e recursivamente tb.

- Criação da propriedade $diretorio_primario, que armazena o diretório principal manualmente

 

Problemas

- Achar um método eficaz de descobrir o diretório principal

- Funcionabilidade do método listarDir em todos os casos (de diretórios recursivos). Meu primeiro método funciona, mas não sei o que você esta pensando sobre o listar, se naum tiver idéia, voltarei a colocar o primeiro método com algumas mudanças ok?

- Na remoção, se tenho "INBOX.teste1.teste2" e mando apagar o "INBOX.teste1", não sei se é meu servidor, mas não apaga, pois não está vazio. e se mando apagar o "INBOX.teste1.teste2" e o "INBOX.teste1" só tiver o "teste2" dentro, ele tb apaga o "INBOX.teste1". Resumindo, se o teste1 só tiver o teste2, ele apaga o teste1 se eu mandar apagar o teste2.

 

ai vai o código

 

<?phpclass imapDir {	protected $imapConexao, $resposta, $tag, $delimitador, $diretorio_primario;	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->tag = "A0000";		$this->diretorio_primario = "INBOX";		return true;	}	function __destruct() {		@fclose($this->imapConexao);		$this->imapConexao = NULL;		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) {		$this->tag++;		// Loga o usuário		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->tag++;		// Procura o delimitador		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 {			return false;		}				return true;	}	function logout() {		$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;		}		return true;	}	function listarDir () {		$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) {		$this->tag++;		if(substr($novo_diretorio, 0, strlen($this->diretorio_primario)) != $this->diretorio_primario) {			$novo_diretorio = $this->diretorio_primario . $this->delimitador . $novo_diretorio;		}		if ($this->enviar_comando(sprintf("%s CREATE %s", $this->tag, $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) {		$this->tag++;		if(substr($dir, 0, strlen($this->diretorio_primario)) != $this->diretorio_primario) {			$dir = $this->diretorio_primario . $this->delimitador . $dir;		}		if ($this->enviar_comando(sprintf("%s DELETE %s", $this->tag, $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) {		$this->tag++;		if(substr($dir, 0, strlen($this->diretorio_primario)) != $this->diretorio_primario) {			$dir = $this->diretorio_primario . $this->delimitador . $dir;		}		if(substr($novoDir, 0, strlen($this->diretorio_primario)) != $this->diretorio_primario) {			$novoDir = $this->diretorio_primario . $this->delimitador . $novoDir;		}		if ($this->enviar_comando(sprintf("%s RENAME %s %s", $this->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") {				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.com.br", "senha");/*if($imap->removerDir("INBOX.imapdir")) echo "Diretório removido<br />\n";else echo "Diretório não removido<br />\n";die;*/$dir = "INBOX.imapdir";$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($dir)) 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->renomearDir($dir, "imapdir1")) echo "Diretório renomeado<br />\n";else echo "Diretório não renomeado<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);	}}repare, que no teste, eu crio o diretório INBOX.imapdir, depois eu trato tudo sem o INBOX, e funciona normalmenteif($imap->removerDir("imapdir1")) 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";?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

isso foi um fim? ^^Ultimo post:Ontem, 12:32

Compartilhar este post


Link para o post
Compartilhar em outros sites

isso é um fim, oficialmente.não tenho mais nada a adicionar a classe, acho que eu fiz o possivel dentro do que eu conheço de programação e do pouco que eu estudei sobre imap. ^_^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

seria melhor alguem de fora fazer a pontuação neh?seria legal colocar uma enquete, assim daria pra saber, e o povo é quem votava ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

apuração??? hehehehejá não basta eleições a cada dois anos???rsrsrsrsah, eu to muito preocupado com isso não, mas põe uma enquete ai e deixa a galera mesmo decidir (vamos fazer jus ao adagio popular: "a voz do povo é a voz de deus").abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, meu tempo tem sido curto, então acompanhei de relance.

De qualquer forma, parabéns pelo empenho de ambos! Gostei muito do resultado e, principalmente, dessa interação que tiveram e o espírito de brincadeira. Com certeza teremos vários bons códigos feitos desta forma ;)

 

Mais uma vez, parabéns aos dois http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

Abraços,

Anderson Mello

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.