Login.php 5.5 KB
<?php

namespace Controller;

use Lib\Mail\Mail;
use Lib\Mail\MailFun;
use Lib\Verify;
use Model\emailSql;



/**
 * 登录
 * @author:dc
 * @time 2023/2/18 16:49
 * Class Login
 * @package Controller
 */
class Login {


    /**
     * 登录操作
     * @return int[]
     * @author:dc
     * @time 2023/2/13 11:50
     */
    public function login(){
        //        $mail,$password,$imap,$smtp
        $formData = app()->request(['email','password','imap','smtp']);

        if(empty($formData['email']) || !Verify::sEmail($formData['email'])){
            app()->e('email_verify_error');
        }

        if(empty($formData['password'])){
            app()->e('password_verify_error');
        }

        if(empty($formData['imap'])){
            app()->e('imap_verify_error');
        }

        if(empty($formData['smtp'])){
            app()->e('smtp_verify_error');
        }

        // 是否是shopk那边已添加的邮箱,进行代理
        $status = file_get_contents('https://oa.shopk.com/fob-check-email/'.$formData['email']);
        // 存在 就把服务器替换为代理服务器
        if($status=='exist'){
            /**
             * 代理功能 去shopk检查邮件是否被添加到shopk了。
             * 如果添加到shopk了就把请求地址替换成shopk的服务器地址
             * 由shopk代理
             * 避免出现换ip登录的情况而被封号
             */
            $callHost = function (string $host,int $prot){
                $host = parse_url($host);
                if(empty($host['host'])){
                    $host = $host['path'].':'.$prot;
                }else{
                    $host = $host['host'].':'.(empty($host['port'])?$prot:$host['port']);
                }
                return $host;
            };

            $formData['imap'] = $callHost($formData['imap'],993);
            $formData['smtp'] = $callHost($formData['smtp'],465);
            // 服务器代理到shopk服务器上面
            // 新增代理 域名 必须要在 43.154.117.107服务器的nginx添加对应的配置,一个域名一个端口为一个配置
            // 配置在 /www/server/panel/vhost/nginx/tcp/ 目录
            $proxy = [
                'imap.gmail.com:993'    =>  '43.154.117.107:10086',
                'smtp.gmail.com:465'    =>  '43.154.117.107:10087',

                'imap-mail.outlook.com:993'    =>  '43.154.117.107:10088',
                'smtp-mail.outlook.com:465'    =>  '43.154.117.107:10089',
//                'outlook.office365.com:993'    =>  '43.154.117.107:10098',

//                'imap.aol.com:993'    =>  '43.154.117.107:10090',
//                'smtp.aol.com:465'    =>  '43.154.117.107:10091',

                'imap.mail.yahoo.com:993'    =>  '43.154.117.107:10092',
                'smtp.mail.yahoo.com:465'    =>  '43.154.117.107:10093',

                'imap.qiye.aliyun.com:993'    =>  '43.154.117.107:10094',
                'smtp.qiye.aliyun.com:465'    =>  '43.154.117.107:10095',

//                'imap.rambler.ru:993'    =>  '43.154.117.107:10096',
//                'smtp.rambler.ru:465'    =>  '43.154.117.107:10097',

                'imaphz.qiye.163.com:993'    =>  '43.154.117.107:10080',
                'smtphz.qiye.163.com:465'    =>  '43.154.117.107:10081',


            ];
            // 是否存在代理
            if(empty($proxy[$formData['imap']]) || empty($proxy[$formData['smtp']]) ){
                app()->e('请联系站点管理员添加代理');
            }
            // 替换为代理服务器
            $formData['imap'] = $proxy[$formData['imap']];
            $formData['smtp'] = $proxy[$formData['smtp']];

        }


        // 进行远程登录,验证
        $mailClient = (new Mail($formData['email'],$formData['password'],$formData['imap']));

        $login = $mailClient->login(false);
        if( $login === 0){
            app()->e('login_error_imap');
        }elseif ($login === -1){
            app()->e('email_server_error');
        }

        // 验证smtp登录
        if(!MailFun::smtpLoginTest($formData['smtp'],$formData['email'],$formData['password'])){
            app()->e('email_smtp_server_error');
        }


        // 是否存在
        $id = db()->value(emailSql::hasEmail($formData['email']));

        $data = [
            'password'  =>  base64_encode($formData['password']),
            'imap'  =>  $formData['imap'],
            'smtp'  =>  $formData['smtp'],
            'status'    =>  1,
            'pwd_error'    =>  0,
            'group_table'    =>  get_request_origin(),
        ];

        if($id){
            // 修改
            $ret = db()->update(emailSql::$table,$data,dbWhere(['id'=>$id]));
        }else{
            // 新增
            $data['email'] = $formData['email'];
            $ret = db()->insert(emailSql::$table,$data);

            if($ret){
//                // 增加邮件数量
//                redis()->incr('email_total');
                // 立即处理 同步
                redis()->lPush('sync_email_lists', $ret);
            }

        }


        if($ret){
            // 同步一次文件夹
            $mailClient->syncFolder(db()->value(emailSql::hasEmail($formData['email'])));

            $ret = db()->first(
                emailSql::first(
                    $formData['email'],
                    '`id`,`email`,`imap`,`smtp`,`status`,`created_at`'
                ));

            $ret = array_merge($ret,app()->request(['imap','smtp']));

            app()->_json($ret);
        }

        app()->e('login_error');


    }







}