proxyImapServer.php 3.3 KB
<?php

require_once "Auth.php";
require_once "ImapClientSwoole.php";


class ProxyService
{

    /**
     * 连接数
     * @var ImapClient[]
     */
    protected static $clients = [];


    /**
     * @author:dc
     * @time 2025/3/29 14:34
     */
    public function run()
    {
        //创建Server对象,监听 127.0.0.1:9501 端口。
        $server = new Swoole\Server('0.0.0.0', 9527, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);

        //监听连接进入事件。
        $server->on('Connect', function ($server, $fd) {});

        //监听数据接收事件。
        $server->on('Receive', function ($server, $fd, $reactor_id, $data) {
            // 建立连接
            if (empty(self::$clients[$fd])) {

                try {
                    $auth = new Auth($data);
                }catch (Throwable $e){
                    $server->send($fd, $e->getMessage());
                    $server->close($fd,true);
                    return;
                }
                // 创建一个客户端
                self::$clients[$fd] = new ImapClientSwoole($auth->host);
                // 连接客户端
                try {
                    self::$clients[$fd]->open($auth->out_ip, $auth->timeOut);
                }catch (Throwable $e){
                    $server->send($fd, $auth->tag . ' BAD ' . $e->getMessage()."\r\n");
                    $server->close($fd,true);
                    return;
                }
                // 发送成功消息
                $server->send($fd, $auth->tag . " OK The proxy server is successfully connected.\r\n");

                // 读取数据
                while (1){
                    if (empty(self::$clients[$fd])){
                        break;
                    }
                    $line = self::$clients[$fd]->readLine();
                    if($line){
                        echo '读取到 => '.$line;
                        $server->send($fd,$line);
                    }else{
                        co::sleep(0.1);
                    }
                }

            } // 正式请求转发
            else {
                // 没有连接成功
                if(empty(self::$clients[$fd])){
                    $server->send($fd, " No proxy server.\r\n");
                    $server->close($fd,true);
                    return;
                }
                // 请求数据
                $writeNumber = self::$clients[$fd]->write($data);
                list($tag,$cmd) = explode(' ',$data,2);
                // 退出命令就不等待服务器了
                if(trim($cmd) == 'LOGOUT'){
                    $server->send($fd, $tag." OK bye.\r\n");
                    $server->close($fd,true);
                    return;
                }
                if($writeNumber){
                    echo '成功写入 => '.$data;
                }else{
                    echo '写入失败 => '.$data;
                    $server->send($fd,$tag.' BAD '.$writeNumber."\r\n");
                }
            }
        });

        //监听连接关闭事件。
        $server->on('Close', function ($server, $fd) {
            echo '连接关闭了 => '.$fd."\n";
            // 关闭并释放资源
            self::$clients[$fd] = null;
            unset(self::$clients[$fd]);
        });

        //启动服务器
        $server->start();
    }

}


(new ProxyService())->run();