PHP操作IMAP服务器的类
作者: 佚名 来源: 本站教程 点击: 日期: 2007-01-11
我认为是相当经典的,帮过我大忙,可以实现很多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);
【文章评论 】
【收藏本文 】
【推荐好友 】
【打印本文 】
【论坛讨论 】
相关文章:
文章评论: (条)
责任编辑:一分 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。