MailList.php 6.1 KB
<?php

namespace Controller\fob_ai;



use Controller\Base;
use Model\folderSql;

/**
 * 黑格 fob 那边专用 业务
 * 为定制逻辑
 * @author:dc
 * @time 2024/7/18 11:40
 * Class MailList
 * @package Controller\fob_ai
 */
class MailList extends Base {


    /**
     * 邮件列表
     * @throws \Lib\Err
     * @author:dc
     * @time 2024/7/18 11:40
     */
    public function lists(){

        // 分页 页数
        $page   =   app()->request('page',1,'intval');
        $page   =   $page ? $page : 1;

        $limit   =   app()->request('limit',20,'intval');
        $limit   =   $limit ? $limit : 1;

        // 指定id
        $ids = app()->request('mail_id');
        $ids = is_array($ids) ? $ids : [$ids];
        foreach ($ids as $i=>$d){
            if(!is_numeric($d)){
                unset($ids[$i]);
            }
        }

        // 附件
        $attachment =   app()->request('attachment',0,'bool_Val');

        $deleted =   0;

        $where = ['email_id'=>$this->getEmails('id')];

        // 目录
        $folder = app()->request('folder','收件箱');
        // 只允许查询这里文件夹
        if(in_array($folder,['收件箱','发件箱','垃圾箱','星标邮件','预热收件箱','预热发件箱']))
            // 查询 文件夹
        $folderList = db()->all(folderSql::all($where['email_id']));
        $folder_id = [];
        // 文件夹id
        if($folderList){
            foreach ($folderList as $item){
                if(
                    // 数组文件夹
                    (is_array($folder) && in_array($item['folder'],$folder))
                    || $item['folder'] == $folder
                ){
                    $folder_id[] = $item['id'];
                }
            }
        }
        if(!$folder_id){
            app()->e('folder_not_fount');
        }

        //目录
        $where['folder_id'] = $folder_id;
        if($ids) $where['id'] = $ids;

        if(paramHas('attachment')){
            $where['is_file'] = $attachment ? 1 : 0; //附件
        }


        // 软删
        $where['deleted'] = $deleted;
        // 已读/未读
        if(paramHas('seen')){
            if(in_array($seen,[0,1])){
                $where['seen'] = $seen;
            }
        }

        $where['_'] = [];
        // 搜索关键字
        $keyword = app()->request('keyword','',['htmlspecialchars','addslashes']);
        if($keyword){
            $where['_'][] = '`subject` like "%'.$keyword.'%"';
        }

        // 那个发的
        $address = app()->request('address');
        if($address){
            if(is_array($address)){
                // 发贱人
                if(Verify::sEmail($address['from']??'')){
                    $where['from'] = $address['from'];
                }
                // 收件人
                if(Verify::sEmail($address['to']??'')){
                    $where['_'][] = '`to_name` like "%'.$address.'%"';
                }

            }else if(Verify::sEmail($address)){
                // 收件人/发件人
                $where['_'][] = '(`from` = "'.$address.'" or `to_name` like "%'.$address.'%")';
            }
        }
        // from 搜索收件人
        if(app()->requestHas('from')){
            // 如果是发件箱
            if($folder == '发件箱'){
                $where['to'] = app()->request('from');
                if(!$where['to']){
                    // 不让查询数据
                    $where['id'] = 0;
                }
            }else{
                $where['from'] = app()->request('from');
                if(!$where['from']){
                    // 不让查询数据
                    $where['id'] = 0;
                }
            }


        }


        // 回复
        if (paramHas('answered')){
            $where['answered'] = app()->request('answered',0,'bool_Val')?1:0;
        }

        // 这个主要是来筛选 是否是自己发送的
        $fromto = app()->request('formorto');
        if($fromto=='from'){
            $where['from'] = $this->getEmails('email');
        }elseif ($fromto=='to'){
            $where['from.notin'] = $this->getEmails('email');
        }

        /**
         * 不查询哪些发件人的邮件
         */
        $form_not_in = app()->request('from_not_in');
        if($form_not_in){
            $form_not_in = is_array($form_not_in) ? $form_not_in : [$form_not_in];
            $form_not_in = array_filter($form_not_in,function ($v){
               if(is_string($v) && Verify::sEmail($v)){
                   return true;
               }
               return false;
            });
            if($form_not_in){
                if(isset($where['from.notin'])){
                    $where['from.notin'] = array_merge($where['from.notin'],$form_not_in);
                }else{
                    $where['from.notin'] = $form_not_in;
                }

            }
        }
        if(!empty($where['from.notin'])){
            $where['from.notin'] = array_unique($where['from.notin']);
        }



        $lists = db()->all(
            listsSql::lists(
                dbWhere($where),
                $page,
                $limit
            )
        );

        // map
        $lists = array_map(function ($v){
            $v['uuid'] = get_email_uuid($v['subject'],$v['udate'],$v['from'],$v['to'],$v['size']);
            if(!empty($v['description'])){
                $v['description'] = @html_entity_decode($v['description'], ENT_COMPAT, 'UTF-8');
            }
            $v['to_name'] = @json_decode($v['to_name'],true);
            $v['to_name'] = $v['to_name']?:[];
            if($v['to_name']){
                if(!empty($v['to_name'][0]['email'])){
                    $v['to'] = $v['to_name'][0]['email'];
                }
                $v['to_name'] = $v['to_name'][0]['name']??'';
            }
            if(is_array($v['to_name'])){
                $v['to_name'] = '';
            }
            return $v;
        },$lists);

        // 总数
        $total  = db()->count(
            listsSql::listCount(dbWhere($where))
        );

        app()->_json(listsPage($lists,$total,$page,$limit));

    }



}