PHP操作IMAP服务器的类
				
				
					
					      
我认为是相当经典的,帮过我大忙,可以实现很多PHP的IMAP函数不能实现的功能。以前在广州站贴过,那时北京站还没PHP版,现在再贴一个吧。:) 
<?php 
/************************************************************* 
File: cyradm.inc.php 
Author: 忘了,嘻嘻 
Date: 2000-11-01 
This is a completely new implementation of the IMAP Access for 
PHP. It is based on a socket connection to the server an is 
independent from the imap-Functions of PHP 
***************************************************************/ 
class cyradm { 
var $host; 
var $port; 
var $mbox; 
var $list; 
var $admin; 
var $pass; 
var $fp; 
var $line; 
var $error_msg; 
/* 
# 
#Konstruktor 
# 
*/ 
function cyradm($IMAP_HOST="localhost", $IMAP_ADMIN="", $IMAP_PW="", $IMAP_PORT="143"){ 
$this->host = $IMAP_HOST; 
$this->port = $IMAP_PORT; 
$this->mbox = ""; 
$this->list = array(); 
$this->admin = $IMAP_ADMIN; 
$this->pass = $IMAP_PW; 
$this->fp = 0; 
$this->line = ""; 
$this->error_msg = ""; 
} 
/* 
# 
# SOCKETLOGIN on Server via Telnet-Connection! 
# 
*/ 
function imap_login() { 
$this->fp = fsockopen($this->host, $this->port, &$errno, &$errstr); 
$this->error_msg=$errstr; 
if(!$this->fp) { 
echo "<br>ERRORNO: ($errno) <br>ERRSTR: ($errstr)<br><hr>\n"; 
} else { 
$this->command(". login \"$this->admin\" \"$this->pass\""); 
} 
return $errno; 
} 
/* 
# 
# SOCKETLOGOUT from Server via Telnet-Connection! 
# 
*/ 
function imap_logout() { 
$this->command(". logout"); 
fclose($this->fp); 
} 
/* 
# 
# SENDING COMMAND to Server via Telnet-Connection! 
# 
*/ 
function command($line) { 
/* print ("$line <br>"); */ 
$result = array(); 
$i=0; $f=0; 
$returntext=""; 
$r = fputs($this->fp,"$line\n"); 
while (!((strstr($returntext,". OK")||(strstr($returntext,". NO"))||(strstr($returntext,". BAD"))))) 
{ 
$returntext=$this->getline(); 
/* print ("$returntext <br>"); */ 
if ($returntext) 
{ 
if (!((strstr($returntext,". OK")||(strstr($returntext,". NO"))||(strstr($returntext,". BAD"))))) 
{ 
$result[$i]=$returntext; 
} 
$i++; 
} 
} 
if (strstr($returntext,". BAD")||(strstr($returntext,". NO"))) 
{ 
$result[0]="$returntext"; 
$this->error_msg = $returntext; 
if (( strstr($returntext,". NO Quota") )) 
{ 
} 
else 
{ 
print "<br><hr><H1><center><blink>ERROR: </blink>UNEXPECTED IMAP-SERVER-ERROR</center></H1><hr><br> 
<table color=red border=0 align=center cellpadding=5 callspacing=3> 
<tr><td>SENT COMMAND: </td><td>$line</td></tr> 
<tr><td>SERVER RETURNED:</td><td></td></tr> 
"; 
for ($i=0; $i < count($result); $i++) { 
print "<tr><td></td><td>$result[$i]</td></tr>"; 
} 
print "</table><hr><br><br>"; 
} 
} 
return $result; 
} 
/* 
# 
# READING from Server via Telnet-Connection! 
# 
*/ 
function getline() { 
$this->line = fgets($this->fp, 256); 
return $this->line; 
} 
/* 
# 
# QUOTA Functions 
# 
*/ 
// GETTING QUOTA 
function getquota($mb_name) { 
$output=$this->command(". getquota \"$mb_name\""); 
if (strstr($output[0],". NO")) 
{ 
$ret["used"] = "NOT-SET"; 
$ret["qmax"] = "NOT-SET"; 
} 
else 
{ 
$realoutput = str_replace(")", "", $output[0]); 
$tok_list = split(" ",$realoutput); 
$si_used=sizeof($tok_list)-2; 
$si_max=sizeof($tok_list)-1; 
$ret["used"] = str_replace(")","",$tok_list[$si_used]); 
$ret["qmax"] = $tok_list[$si_max]; 
} 
return $ret; 
} 
// SETTING QUOTA 
function setmbquota($mb_name, $quota) { 
$this->command(". setquota \"$mb_name\" (STORAGE $quota)"); 
} 
/* 
# 
# MAILBOX Functions 
# 
*/ 
function createmb($mb_name, $mb_partition="") { 
$this->command(". create \"$mb_name\" $mb_partition"); 
} 
function deletemb($mb_name) { 
$this->command(". setacl \"$mb_name\" $this->admin d"); 
$this->command(". delete \"$mb_name\""); 
} 
function renamemb($mb_name, $newmbname) { 
$all="lrswipcda"; 
$this->setacl($mb_name, $this->admin,$all); 
$this->command(". rename \"$mb_name\" \"$newmbname\""); 
$this->deleteacl($newmbname, $this->admin); 
} 
function renameuser($from_mb_name, $to_mb_name) { 
$all="lrswipcda"; $find_out=array(); $split_res=array(); $owner=""; $oldowner=""; 
/* Anlegen und Kopieren der INBOX */ 
$this->createmb($to_mb_name); 
$this->setacl($to_mb_name, $this->admin,$all); 
$this->copymailsfromfolder($from_mb_name, $to_mb_name); 
/* Quotas uebernehmen */ 
$quota=$this->getquota($from_mb_name); 
$oldquota=trim($quota["qmax"]); 
if (strcmp($oldquota,"NOT-SET")!=0) { 
$this->setmbquota($to_mb_name, $oldquota); 
} 
/* Den Rest Umbenennen */ 
$username=str_replace(".","/",$from_mb_name); 
$split_res=explode(".", $to_mb_name); 
if (strcmp($split_res[0],"user")==0) { 
$owner=$split_res[1]; 
} 
$split_res=explode(".", $from_mb_name); 
if (strcmp($split_res[0],"user")==0) { 
$oldowner=$split_res[1]; 
} 
$find_out=$this->GetFolders($username); 
for ($i=0; $i < count($find_out); $i++) { 
if (strcmp($find_out[$i],$username)!=0) { 
$split_res=split("$username",$find_out[$i]); 
$split_res[1]=str_replace("/",".",$split_res[1]); 
$this->renamemb((str_replace("/",".",$find_out[$i])), ("$to_mb_name"."$split_res[1]")); 
if ($owner) { 
$this->setacl(("$to_mb_name"."$split_res[1]"),$owner,$all); 
} 
if ($oldowner) { 
$this->deleteacl(("$to_mb_name"."$split_res[1]"),$oldowner); 
} 
}; 
} 
$this->deleteacl($to_mb_name, $this->admin); 
$this->imap_logout(); 
$this->imap_login(); 
$this->deletemb($from_mb_name); 
} 
function copymailsfromfolder($from_mb_name, $to_mb_name) { 
$com_ret=array(); 
$find_out=array(); 
$all="lrswipcda"; 
$mails=0; 
$this->setacl($from_mb_name, $this->admin,$all); 
$com_ret=$this->command(". select $from_mb_name"); 
for ($i=0; $i < count($com_ret); $i++) { 
if (strstr( $com_ret[$i], "EXISTS")) 
{ 
$findout=explode(" ", $com_ret[$i]); 
$mails=$findout[1]; 
} 
} 
if ( $mails != 0 ) { 
$com_ret=$this->command(". copy 1:$mails $to_mb_name"); 
for ($i=0; $i < count($com_ret); $i++) { 
print "$com_ret[$i]<br>"; 
} 
} 
$this->deleteacl($from_mb_name, $this->admin); 
} 
/* 
# 
# ACL Functions 
# 
*/ 
function setacl($mb_name, $user, $acl) { 
$this->command(". setacl \"$mb_name\" \"$user\" $acl"); 
} 
function deleteacl($mb_name, $user) { 
$result=$this->command(". deleteacl \"$mb_name\" \"$user\""); 
} 
function getacl($mb_name) { 
$aclflag=1; $tmp_pos=0; 
$output = $this->command(". getacl \"$mb_name\""); 
$output = explode(" ", $output[0]); 
$i=count($output)-1; 
while ($i>3) { 
if (strstr($output[$i],\")) { 
$i++; 
} 
if (strstr($output[$i-1],\")) { 
$aclflag=1; 
$lauf=$i-1; 
$spacestring=$output[$lauf]; 
$tmp_pos=$i; 
$i=$i-2; 
while ($aclflag!=0) 
{ 
$spacestring=$output[$i]." ".$spacestring; 
if (strstr($output[$i],\")) { $aclflag=0; } 
$i--; 
} 
$spacestring=str_replace("\"","",$spacestring); 
if ($i>2) { 
$ret[$spacestring] = $output[$tmp_pos]; 
} 
} 
else 
{ 
$ret[$output[$i-1]] = $output[$i]; 
$i = $i - 2; 
} 
} 
return $ret; 
} 
/* 
# 
# Folder Functions 
# 
*/ 
function GetFolders($username){ 
$username=str_replace("/",".",$username); 
$output = $this->command(". list \"$username\" *"); 
for ($i=0; $i < count($output); $i++) { 
$splitfolder=split("\"",$output[$i]); 
$output[$i]=str_replace(".","/",$splitfolder[3]); 
} 
return $output; 
} 
function EGetFolders($username){ 
$lastfolder=split("/",$username); 
$position=count($lastfolder)-1; 
$last=$lastfolder[$position]; 
$username=str_replace("/",".",$username); 
$output = $this->command(". list \"$username\" *"); 
for ($i=0; $i < count($output); $i++) { 
$splitfolder=split("\"",$output[$i]); 
$currentfolder=split("\.",$splitfolder[3]); 
$current=$currentfolder[$position]; 
// echo "<br>FOLDER:($) CURRENTFOLDER:($splitfolder[3]) CURRENT:($current) LAST:($last) POSITION:($position)<br>"; 
if (strcmp($current,$last)==0){ 
$newoutput[$i]=str_replace(".","/",$splitfolder[3]); 
} 
} 
return $newoutput; 
} 
/* 
# 
# Folder-Output Functions 
# 
*/ 
function GenerateFolderList($folder_array, $username) 
{ 
print "<table border=0 align=center>"; 
for ($l=0; $l<count($folder_array); $l++) 
{ 
echo "<tr><td><a href=\"acl.php?username=", 
urlencode($username), 
"&folder=", 
urlencode($folder_array[$l]), 
"\">/$folder_array[$l]</td></tr>\n"; 
}; 
print "</table>"; 
} 
function GetUsers($char) { 
$users = array(); 
$this->imap_login(); 
$output=$this->GetFolders("user.$char"); 
$this->imap_logout(); 
$j = 0; 
$prev = 0; 
for ($i=0; $i < count($output); $i++) { 
$username = split("/", $output[$i],-1); 
$this->debug("($username[1]), 
$users[$prev])"); 
if ((isset($username)) && (isset($users))) { 
if (strcmp($username[1], $users[$prev])) { 
$users[$j] = $username[1]; 
$j++; 
} 
} 
if ($j != 0) { $prev = $j - 1; } 
} 
return $users; 
} 
function debug($message) { 
// echo "<hr>$message<br><hr>"; 
} 
} //KLASSEN ENDE 
?> 
摘自:网易社区 
 
发布人:netbull 来自:非常Linux