精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● PHP>>功能代码>>邮件相关>>PHP操作IMAP服务器的类

主题:PHP操作IMAP服务器的类
发信人: sunyao(小凡)
整理人: dalasthunder(2002-07-25 06:30:13), 站内信件
<?php
/*************************************************************

File: php_imap.inc.php
Author: Sunny Your
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

Copyright 2000 Sunny Your <[email protected]>

 ***************************************************************/

class cyradm {

  var $host;
  var $port;
  var $mbox;
  var $list;

  var $admin;
  var $pass;
  var $fp;
  var $line;
  var $error_msg;

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
  
?>

[关闭][返回]