<?php namespace Controller; use Lib\Mail\Mail; use Lib\Mail\MailFun; use Lib\UploadFile; use Lib\Verify; use Model\bodySql; use Model\emailSql; use Model\folderSql; use Model\listsSql; use Model\sendJobsSql; use Service\SyncMail; /** * @author:dc * @time 2023/2/13 11:28 * Class Home * @package Controller */ class HomeEs extends Base { /** * 邮件列表 * @author:dc * @time 2023/2/17 14:12 */ 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'); // 已读/未读 $seen = app()->request('seen',-1,'intval'); // 软删 $deleted = app()->request('deleted',0,'intval'); $query = [ 'query'=>[ 'bool'=>[ 'must'=>[ [ 'terms'=>['email_id'=>$this->getEmails('id')] ] ] ] ] ]; $folder_id = []; if (app()->requestArr('folder_id')){ $folder_id = app()->requestArr('folder_id'); }else{ // 目录 $folder = app()->request('folder','收件箱','folderAlias'); if(!($folder === true || $folder ==='true')){ $folderList = db()->all(folderSql::all($this->getEmails('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){ $query['query']['bool']['must'][] = ['terms'=>[ 'folder_id'=>$folder_id ]]; } if($ids) { $query['query']['bool']['must'][] = ['terms'=>[ 'uuid'=>$folder_id ]]; } if(paramHas('attachment')){ //附件 $query['query']['bool']['must'][] = ['term'=>[ 'is_file'=>$attachment ? 1 : 0 ]]; } // 软删 $query['query']['bool']['must'][] = ['term'=>[ 'deleted'=>$deleted ]]; // 已读/未读 if(paramHas('seen')){ if(in_array($seen,[0,1])){ $query['query']['bool']['must'][] = ['term'=>[ 'seen'=>$seen ]]; } } $where['_'] = []; // 搜索关键字 $keyword = app()->request('keyword','',['htmlspecialchars','addslashes']); if($keyword){ $query['query']['bool']['must'][] = [ 'query_string' => [ 'query'=>'"'.addcslashes($keyword,'"').'"', "default_field"=> "subject" ] ]; } // 那个发的 $address = app()->request('address'); if($address){ if(is_array($address)){ // 发贱人 if(Verify::sEmail($address['from']??'')){ $query['query']['bool']['must'][] = ['match_phrase'=>['from.email'=>$address['from']]]; } // 收件人 if(Verify::sEmail($address['to']??'')){ $query['query']['bool']['must'][] = [ 'match_phrase' => [ 'to'=> $address['to'], ] ]; } }else if($address){// 收件人/发件人 $query['query']['bool']['must'][] = [ 'bool' =>[ 'should'=>[ ['bool'=>['must'=>[['match_phrase'=>['from.email'=>$address]]]]], ['bool'=>['must'=>[['match_phrase'=>['to'=>$address]]]]], ] ] ]; } } // from 搜索收件人 if(app()->requestHas('from')){ // 如果是发件箱 if($folder == '发件箱'){ $tos = app()->request('from'); if(!$tos){ // 不让查询数据 $query['query']['bool']['must'][] = ['term'=>['uuid'=>0]]; }else { $tos = array_map(function ($v){ return '"'.addcslashes($v,'"').'"'; },is_array($tos) ? $tos : [$tos]); $query['query']['bool']['must'][] = [ 'query_string' => [ 'query'=> implode(' OR ',$tos), "default_field"=> "to" ] ]; } }else{ $from = app()->request('from'); if(!$from){ // 不让查询数据 $query['query']['bool']['must'][] = ['term'=>['uuid'=>0]]; }else{ $from = is_array($from)?$from:[$from]; $query['query']['bool']['must'][] = ['query_string'=>[ 'query'=>'from.email:('.implode(' OR ',array_map(function($e){ return '"'.$e.'"'; },$from)).')'] ]; } } } // 回复 if (paramHas('answered')){ $query['query']['bool']['must'][] = ['term'=>['answered'=>app()->request('answered',0,'bool_Val')?1:0]]; } // 这个主要是来筛选 是否是自己发送的 $fromto = app()->request('formorto'); if($fromto=='from'){ $query['query']['bool']['must'][] = [ 'query_string' => [ 'query'=> implode(' OR ',$this->getEmails('email')), "default_field"=> "from" ] ]; }elseif ($fromto=='to'){ $query['query']['bool']['must'][] = [ 'bool'=>[ 'must_not'=>[ [ 'query_string' => [ 'query'=> implode(' OR ',$this->getEmails('email')), "default_field"=> "from" ] ] ] ] ]; } /** * 不查询哪些发件人的邮件 */ $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){ $query['query']['bool']['must'][] = [ 'bool'=>[ 'must_not'=>[ [ 'query_string' => [ 'query'=> implode(' OR ',array_unique($form_not_in)), "default_field"=> "from" ] ] ] ] ]; } $lists = es()->search($query, ($page-1)*$limit, $limit,['udate'=>'desc']); $total = $lists['hits']['total']['value']??0; $lists = $lists['hits']['hits']??[]; // map $lists = array_map(function ($v){ $v = $v['_source']; $v['id'] = $v['uuid']; $v['from_name'] = $v['from']['name']??''; $v['from'] = $v['from']['email']??''; $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'] = MailFun::mb_coding($v['to_name'][0]['name']??''); } if(is_array($v['to_name'])){ $v['to_name'] = ''; } // 邮件箱 $v['folder_name'] = db()->cache(86400)->value(folderSql::first($v['folder_id'],'folder')); return $v; },$lists); app()->_json(listsPage($lists,$total,$page,$limit)); } /** * 统计 * @throws \Lib\Err * @author:dc * @time 2024/10/14 16:20 */ public function count() { $body = []; $body['query'] = [ 'bool'=>[ 'must'=>[ ['term'=>['deleted'=>0]] ] ] ]; $start_time = app()->request('start_time',0,'intval'); $end_time = app()->request('end_time',0,'intval'); if($start_time){ $body['query']['bool']['must'][] = [ 'range' => [ 'udate' => [ 'gte' => $start_time, // 大于等于开始日期 ] ] ]; } if($end_time){ $body['query']['bool']['must'][] = [ 'range' => [ 'udate' => [ 'lte' => $end_time, ] ] ]; } // 目录 $folderList = db()->all(folderSql::all($this->getEmails('id'))); $count = function ($body,$folder,$seen=null) use ($folderList){ // 文件夹id $fids = []; foreach ($folderList as $item) { if ($item['folder'] == $folder) { $fids[] = $item['id']; } } if($fids){ $body['query']['bool']['must'][] = [ 'terms' => [ 'folder_id' => $fids ] ]; }else{ $body['query']['bool']['must'][] = [ 'term' => [ 'folder_id' => -1 ] ]; } if($seen!==null){ // 未读 $body['query']['bool']['must'][] = [ 'term' => [ 'seen' => $seen ] ]; } return es()->count($body); }; // 总数 $inbox = $count($body,'收件箱'); if(app()->request('show')=='inbox'){ app()->_json(['inbox'=>$inbox]); } $unseen = $count($body,'收件箱',0); //发件箱 $send = $count($body,'发件箱',0); app()->_json(['inbox'=>$inbox,'unseen'=>$unseen,'send'=>$send]); } }