当前位置: 首页 > 知识库问答 >
问题:

用PHP实现的IMAP或POP3服务器

红明德
2023-03-14

在PHP中是否有POP3/IMAP服务器的可用实现?

我正在使用sendrid处理我的电子邮件服务。我将使用文件/db/任何文件在我的服务器上存储消息,现在我想为我的用户提供完整的POP3或IMAP(优选)访问他们的邮箱。PHP中是否有这样的实现?或者还有其他可能在Windows Azure的分布式环境中运行POP3/IMAP(假设我将邮箱存储在共享Blob/table/db中)?

共有1个答案

柯河
2023-03-14

好的,只是为了说明用PHP编写POP3服务器实际上是可能的,这里就是。服务器不进行身份验证——或者几乎不做任何其他事情。它只是一次又一次地发送同样的信息。但它是有效的。雷鸟能够从中检索信息。完全没用,但有点酷。

我的设置是Windows上的Apache 2和PHP 5.2。

<?php

// 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;
    }
}

?>
 类似资料:
  • 邮局协议(POP)是本地电子邮件客户端用于通过TCP/IP连接从远程服务器检索电子邮件的应用程序层Internet标准协议。 POP支持访问远程邮箱的简单下载和删除要求。 POP3服务器侦听已知端口110。 软件包com.sun.mail.pop3是JavaMail API的POP3协议提供程序,提供对POP3消息存储的访问。 下表列出了此包中的类: 名称 描述 POP3Folder POP3文件

  • IMAP是Internet Message Access Protocol缩写。 它是一种应用层Internet协议,允许电子邮件客户端访问远程邮件服务器上的电子邮件。 IMAP服务器通常侦听众所周知的端口143.基于SSL的IMAP(IMAPS)被分配给端口号993。 IMAP支持在线和离线操作模式。 使用IMAP的电子邮件客户端通常会在服务器上保留消息,直到用户明确删除它们为止。 软件包com

  • 问题内容: 我正在尝试从POP3获取邮件(我正在使用POP3邮件服务器,并且正在尝试获取邮件内容并将其存储到我的项目的数据库表中。),但是我找不到所有的PHP脚本仅适用于IMAP。 您知道如何从POP3服务器中提取邮件吗? 谢谢。 问题答案: 令人惊讶的是,PHP的imap库也可以用于处理POP3邮箱。当然,大多数高级IMAP功能都无法使用(例如,文件夹或获取邮件部分),但是已实现了基本的POP3

  • 问题内容: 如果存在一个以上的实现,哪个/更好的维护? 专门用于OAuth 2.0草案12。 问题答案: 来自OAuth Wiki ,似乎有一个名为oauth2-php的 PHP实现,它支持IETF v9草案。由于OAuth2仍是草案,因此可能很难找到更多实现。

  • 在之前的几篇教程中,我们讲的是如何查询和Mutation操作,这些都是在客户端那边所进行的,那么服务器这边是如何处理这些请求的呢?这就是这篇教程所要说的东西了. 准备工作 克隆库: git clone https://github.com/zhouyuexie/learn-graphql 安装依赖: cd learn-graphql && npm install cd learn-graphql

  • 创建实现服务的类,继承刚才创建的服务接口并实现接口即可: public class HelloService : IHelloService { public async Task<ResultModel> SayHello(string name) { ...具体的业务代码 return await