pop3 php,用PHP实现的IMAP或POP3服务器

好吧,只是为了表明实际上可以在PHP中编写POP3服务器,就在这里.服务器不进行身份验证 – 或者其他任何事情.它只是一遍又一遍地发送相同的消息.但它的确有效. Thunderbird能够从中检索消息.完全没用,但有点酷.

我的设置是Windows 2上的Apache 2,PHP 5.2.

// echo something so fopen() would return

header("Content-type: text/plain");

echo "OK\n";

flush();

// listen for incoming connection

$listen_socket = socket_create_listen(110, 1);

$r = $w = $e = array($listen_socket);

$n = socket_select($r, $w, $e, 120);

$client_socket = ($n == 1) ? socket_accept($listen_socket) : null;

socket_close($listen_socket);

// spawn copy of myself

$internal_url = "http://{$_SERVER['HTTP_HOST']}:{$_SERVER['SERVER_PORT']}{$_SERVER['SCRIPT_NAME']}";

$stream_context_options = array (

'http' => array (

'method' => 'GET',

'timeout' => 1

)

);

$context = stream_context_create($stream_context_options);

if($f = fopen($internal_url, "rb", 0, $context)) {

fclose($f);

}

if(!$client_socket) {

// timed out

exit;

}

// start handling the session

$read_buffer = "";

$write_buffer = "+OK POP3 server ready\r\n";

$active = true;

$messages = array(

"From: webmaster@example.com\r\nSubject: This is a test\r\n\r\nHello world!\r\n"

);

$idle_start = time();

while(true) {

$r = $w = $e = array($client_socket);

$n = socket_select($r, $w, $e, 60);

if($n) {

if($r) {

// read from the socket

$read_buffer .= socket_read($client_socket, 128);

$idle_start = time();

}

if($w) {

if($write_buffer) {

// write to the socket

$written = socket_write($client_socket, $write_buffer);

$write_buffer = substr($write_buffer, $written);

$idle_start = time();

} else if($active) {

$now = time();

$idle_time = $now - $idle_start;

if($idle_time > 10) {

// exit if nothing happened for 10 seconds

break;

} else if($idle_time > 2) {

// start napping when the client is too slow

sleep(1);

}

} else {

break;

}

}

if($e) {

break;

}

if($read_buffer) {

if(preg_match('/(.*?)(?:\s+(.*?))?[\r\n]+/', $read_buffer, $matches)) {

$read_buffer = substr($read_buffer, strlen($matches[0]));

$command = $matches[1];

$argument = $matches[2];

switch($command) {

case 'USER':

$username = $argument;

$write_buffer .= "+OK $username is welcome here\r\n";

break;

case 'PASS':

$message_count = count($messages);

$write_buffer .= "+OK mailbox has $message_count message(s)\r\n";

break;

case 'QUIT':

$write_buffer .= "+OK POP3 server signing off\r\n";

$active = false;

break;

case 'STAT':

$message_count = count($messages);

$mailbox_size = 0;

foreach($messages as $message) {

$mailbox_size += strlen($message);

}

$write_buffer .= "+OK $message_count $mailbox_size\r\n";

break;

case 'LIST':

$start_index = (int) $argument;

$message_count = count($messages) - $start_index;

$total_size = 0;

for($i = $start_index; $i < count($messages); $i++) {

$total_size += strlen($messages[$i]);

}

$write_buffer .= "+OK $message_count messages ($total_size octets)\r\n";

for($i = $start_index; $i < count($messages); $i++) {

$message_id = $i + 1;

$message_size = strlen($messages[$i]);

$write_buffer .= "$message_id $message_size\r\n";

}

$write_buffer .= ".\r\n";

break;

case 'RETR':

$message_id = (int) $argument;

$message = $messages[$message_id - 1];

$message_size = strlen($message);

$write_buffer .= "+OK $message_size octets\r\n";

$write_buffer .= "$message\r\n";

$write_buffer .= ".\r\n";

break;

case 'DELE':

$write_buffer .= "+OK\r\n";

break;

case 'NOOP':

$write_buffer .= "+OK\r\n";

break;

case 'LAST':

$message_count = count($messages) - $start_index;

$write_buffer .= "+OK $message_count\r\n";

break;

case 'RSET':

$write_buffer .= "+OK\r\n";

break;

default:

$write_buffer .= "-ERR Unknown command '$command'\r\n";

}

}

}

} else {

break;

}

}

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值