ホームページ >php教程 >php手册 >IMAPサーバーを動作させるためのPHPクラス

IMAPサーバーを動作させるためのPHPクラス

WBOY
WBOYオリジナル
2016-06-21 09:15:221255ブラウズ

サーバー

非常に古典的で、PHPのIMAP機能では実現できない機能を多く実現できると思います。以前広州駅に投稿しましたが、その時は北京駅にPHP版がありませんでしたので再度投稿します。 :)

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

ファイル: cyradm.inc.php
作成者: 忘了,嘻嘻
日付: 2000-11-01

これは、
PHP 用の IMAP Access の完全に新しい実装です。これはサーバーへのソケット接続に基づいており、
PHP の imap 関数から独立しています

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

var $host;
var $admin; var $pass;
var $line;

/*
#
#Konstruktor
*/
function cyradm($IMAP_HOST="localhost", $IMAP_ADMIN="" $IMAP_PW="", $IMAP_PORT="143"){
$this->ホスト = $IMAP_HOST;
$this->mbox = ""; ->リスト = 配列();
$this->admin = $IMAP_PW;
$this->fp = 0; "";
$this->error_msg = "";


/*
#
# Telnet 接続によるサーバー上の SOCKETLOGIN!
#
*/
function imap_login() {
$this-> fp = fsockopen($this->ホスト, $this->ポート, &$errno, &$errstr);
$this->error_msg=$errstr;
if(!$this->fp) {
echo "
ERRORNO: ($errno)
ERRSTR: ($errstr)


n";
} else {
$this->command(".login " $this->admin" "$this->pass");
}
return $errno;


/*
#
# Telnet 接続経由でサーバーからログアウトします! function imap_logout() {
$this->command(".logout");
fclose($this->fp);


/*
#
# Telnet 接続経由でサーバーにコマンドを送信します。
#
*/
function コマンド($line) {
/* print ("$line
") */
$i=0; $returntext="";
$r = fputs($this->fp,"$linen");
while (!((strstr($returntext,". OK")||(strstr($returntext," .NO"))||(strstr($returntext,".BAD")))))
{
$returntext=$this->getline();
/* print ("$returntext
" ); */
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 クォータ) ") ))
{

}
else
{
print "

エラー: 予期しない IMAP サーバー エラー< /center>






";
for ($i=0; $i print "";
}
print "
送信されたコマンド: < /td>$line
サーバーが戻りました:
$result[$i]



";
}
}
return $result;
}


/*
#
# Telnet 接続経由でサーバーから読み取ります!
#
*/

function getline() {
$this->line = fgets($this->fp, 256); ->line;
}

/*
#
# QUOTA 関数
#
*/

// クォータの取得

function getquota($mb_name) {
$output=$this->command(". getquota "$mb_name"");
if (strstr($output[0],". NO"))
{
$ret["used"] = "NOT-SET";
$ret["qmax"] = "設定されていません";
else
{
$realoutput = str_replace(")", "", $output[0]); sizeof($tok_list)-2;
$si_max=sizeof($tok_list)-1;
$ret["used"] = str_replace(")","",$tok_list[$si_used]); "qmax"] = $tok_list[$si_max];
}
return $ret;


// クォータの設定

function setmbquota($mb_name, $quota) {
$this->command(". setquota "$mb_name" (STORAGE $quota)");
}



/*
#
# メールボックス関数
#
*/

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);

/* クォータ uebernehmen */
$quota=$this->getquota($from_mb_name);
$oldquota=trim($quota["qmax"]);

if (strcmp($oldquota,"NOT-SET")!=0) {
$this->setmbquota($to_mb_name, $oldquota);
}

/* デン レスト ウンベネンネン */
$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( "$ユーザー名",$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";
$メール=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]
";
}
}
$this->deleteacl($from_mb_name, $this->admin);
}

/*
#
# ACL 関数
#
*/

function setacl($mb_name, $user, $acl) {
$this->command(". setacl "$mb_name" "$user " $acl");
}


function deleteacl($mb_name, $user) {
$result=$this->command(".deletacl "$mb_name" "$user"");
}


関数 getacl($mb_name) {
$aclflag=1; $tmp_pos=0;
$output = $this->command(".getacl "$mb_name"");
$output =explode(" ", $output[0]);
$i=カウント($output)-1;
while ($i>3) {
if (strstr($output[$i],'"')) {
$i++;
}

if (strstr($output[$i-1],'" ')) {
$aclflag=1;
$ラウフ=$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;
}

/*
#
# フォルダー関数
#
*/

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);位置 = カウント ($lastfolder)-1;
$last=$lastfolder[$position];
$username=str_replace("/",".",$username); ".list "$username" *");

for ($i=0; $i < count($output); $i++) {
$splitfolder=split(""",$output[$i] );
$currentfolder=split(".",$splitfolder[3]);
$current=$currentfolder[$position];
// echo "
FOLDER:($) CURRENTFOLDER:($splitfolder[3]) CURRENT:($current) LAST:($last) POSITION:($position)
";
if (strcmp($current,$last)==0){
$newoutput[$i]=str_replace(".","/",$splitfolder[3]);
}
}
$newoutput を返します。
}


/*
#
# フォルダー出力関数
#
*/

function GenerateFolderList($folder_array, $username)
{
print "";
for ($l=0; $l{
echo "n";
};
print "
urlencode( $username),
"&folder=",
urlencode($folder_array[$l]),
"">/$folder_array[$l]
";
}


function GetUsers($char) {
$users = array();
$this->imap_login();
$output=$this->GetFolders("user.$char");
$this->imap_logout();
$j = 0;
$前 = 0;
for ($i=0; $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; }
}
$users を返します。
}

function debug($message) {
// echo "
$message

";
}


} //クラッセン・エンデ

?> 



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。