|
|
<?php
|
|
|
|
|
|
namespace Controller\fob_ai;
|
|
|
|
|
|
|
|
|
|
|
|
use Controller\Base;
|
|
|
use Lib\Es\Es;
|
|
|
use Lib\Mail\MailFun;
|
|
|
use Lib\Verify;
|
|
|
use Model\folderSql;
|
|
|
use function Swoole\Coroutine\Http\request;
|
|
|
|
|
|
/**
|
|
|
* 黑格 fob 那边专用 业务
|
|
|
* 为定制逻辑
|
|
|
* @author:dc
|
|
|
* @time 2024/7/18 11:40
|
|
|
* Class MailList
|
|
|
* @package Controller\fob_ai
|
|
|
*/
|
|
|
class MailListV2Es extends Base {
|
|
|
|
|
|
/**
|
|
|
* @var Es
|
|
|
*/
|
|
|
public $es;
|
|
|
|
|
|
public function __construct()
|
|
|
{
|
|
|
$this->es = new Es('hg_ai_emails');
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 当前邮箱下指定的文件夹
|
|
|
* @param string $folder
|
|
|
* @return array
|
|
|
* @throws \Lib\Err
|
|
|
* @author:dc
|
|
|
* @time 2024/7/19 11:37
|
|
|
*/
|
|
|
private function getFolderId(string $folder,$emails=[]){
|
|
|
if(!$emails){
|
|
|
$emails = $this->getEmails('id');
|
|
|
}
|
|
|
$k = md5(json_encode($emails));
|
|
|
// 查询 文件夹
|
|
|
static $folderList;
|
|
|
if(empty($folderList[$k])){
|
|
|
$folderList[$k] = db()->all(folderSql::all($emails));
|
|
|
}
|
|
|
$folder_id = [];
|
|
|
// 文件夹id
|
|
|
if($folderList[$k]){
|
|
|
foreach ($folderList[$k] as $item){
|
|
|
if(folderAlias($item['folder']) == $folder){
|
|
|
$folder_id[] = $item['id'];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if(!$folder_id){
|
|
|
app()->e('folder_not_fount');
|
|
|
}
|
|
|
|
|
|
return $folder_id;
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
* 处理like条件
|
|
|
* @param $str
|
|
|
* @return string
|
|
|
* @author:dc
|
|
|
* @time 2024/9/4 11:14
|
|
|
*/
|
|
|
private function getLikeStr($str){
|
|
|
if(str_starts_with($str, '^')){
|
|
|
return addslashes(mb_substr($str,1,99)).'%%';
|
|
|
}
|
|
|
return '%%'.addslashes($str).'%%';
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 邮件列表
|
|
|
* 接收参数
|
|
|
* page 分页
|
|
|
* limit 每页数量
|
|
|
* mail_id 指定邮件id
|
|
|
* attachment 是否附件
|
|
|
* emails 邮箱
|
|
|
* folder 文件夹
|
|
|
* from_not_in 不在这些发件箱的邮件
|
|
|
* @throws \Lib\Err
|
|
|
* @author:dc
|
|
|
* @time 2024/7/18 11:40
|
|
|
*/
|
|
|
public function lists(){
|
|
|
|
|
|
// 分页 页数
|
|
|
$page = app()->request('page',1,'intval') ? : 1;
|
|
|
$limit = app()->request('limit',20,'intval') ? : 1;
|
|
|
|
|
|
// 指定id
|
|
|
$ids = app()->requestArr('mail_id');
|
|
|
foreach ($ids as $i=>$d){
|
|
|
if(!is_numeric($d)){
|
|
|
unset($ids[$i]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 目录
|
|
|
$folder = app()->request('folder','收件箱');
|
|
|
// 只允许查询这里文件夹
|
|
|
if(!in_array($folder,['收件箱','发件箱','垃圾箱','星标邮件','预热收件箱','预热发件箱','自动回复收件箱','Starred','草稿箱'])){
|
|
|
app()->e('folder_not_fount');
|
|
|
}
|
|
|
|
|
|
$where['is_hots'] = 0;
|
|
|
|
|
|
if($folder=='星标邮件'||$folder=='Starred'){
|
|
|
$folder = '收件箱';
|
|
|
$where['flagged'] = 1; // 星标
|
|
|
unset($where['is_hots']);
|
|
|
}elseif ($folder=='预热收件箱'){
|
|
|
$folder = '收件箱';
|
|
|
$where['is_hots'] = 1;
|
|
|
}elseif ($folder=='预热发件箱'){
|
|
|
$folder = '发件箱';
|
|
|
$where['is_hots'] = 1;
|
|
|
} elseif ($folder=='自动回复收件箱'){
|
|
|
$is_auto_inbox = 1;
|
|
|
$folder = '收件箱';
|
|
|
$where['is_hots'] = 0;
|
|
|
}elseif ($folder=='草稿箱'){
|
|
|
$folder = '草稿箱';
|
|
|
$where['is_hots'] = 0;
|
|
|
}
|
|
|
|
|
|
$seen = app()->request('seen',-1,'intval');
|
|
|
// 已读/未读
|
|
|
if(paramHas('seen')){
|
|
|
if(in_array($seen,[0,1])){
|
|
|
$where['seen'] = $seen;
|
|
|
}
|
|
|
}
|
|
|
// 搜索标题
|
|
|
$where['subject'] = [];
|
|
|
$keyword = app()->request('keyword');
|
|
|
if($keyword){
|
|
|
$where['subject'] = $keyword;
|
|
|
}
|
|
|
// 联系人
|
|
|
$address = app()->request('address');
|
|
|
if($address){
|
|
|
if(is_array($address)){
|
|
|
// 发贱人
|
|
|
if(Verify::sEmail($address['from']??'')){
|
|
|
if($folder=='发件箱'){
|
|
|
$where['to'] = $address['from'];
|
|
|
}else{
|
|
|
$where['from'] = $address['from'];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if($ids) $where['uuid'] = $ids;
|
|
|
|
|
|
if(app()->request('attachment',0,'bool_Val')){
|
|
|
// 附件
|
|
|
$where['is_file'] = 1; //附件
|
|
|
}
|
|
|
|
|
|
// 软删
|
|
|
$where['deleted'] = 0;
|
|
|
|
|
|
|
|
|
/************ 2024-09-02 *************/
|
|
|
if($folder=='收件箱' && empty($where['flagged']) && !$ids) {
|
|
|
if(!empty($is_auto_inbox)){
|
|
|
// 是否是自动收件箱
|
|
|
$where['is_auto'] = 1;
|
|
|
}else{
|
|
|
$where['is_auto'] = 0;
|
|
|
}
|
|
|
}
|
|
|
/************ 2024-09-02 *************/
|
|
|
|
|
|
$query = [
|
|
|
'bool'=>[
|
|
|
'must' => []
|
|
|
]
|
|
|
];
|
|
|
foreach ($where as $k=>$v){
|
|
|
if($k=='subject'){
|
|
|
$query['bool']['must'][] = [
|
|
|
'query_string' => [
|
|
|
'query'=>'"'.addcslashes($keyword,'"').'"',
|
|
|
"default_field"=> "subject"
|
|
|
]
|
|
|
];
|
|
|
}else{
|
|
|
$query['bool']['must'][] = [
|
|
|
'term' => [
|
|
|
$k=>$v
|
|
|
]
|
|
|
];
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 星标就不加文件夹赛选
|
|
|
if(empty($where['flagged'])){
|
|
|
$query['bool']['must'][] = $this->assignSql($folder);
|
|
|
}else{
|
|
|
$query['bool']['must'][] = $this->assignSql2();
|
|
|
}
|
|
|
|
|
|
|
|
|
$result = $this->es->search(['query'=>$query],($page-1) * $limit,$limit,['udate'=>"desc"]);
|
|
|
app()->_json($result);
|
|
|
|
|
|
// map
|
|
|
// $lists = array_map(function ($v){
|
|
|
// $v['uuid'] = md5($v['email_id'].'-'.$v['folder_id'].'-'.$v['uid']);
|
|
|
// 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'] = '';
|
|
|
// }
|
|
|
// return $v;
|
|
|
// },$lists?:[]);
|
|
|
|
|
|
|
|
|
|
|
|
// app()->_json(listsPage($lists,$total,$page,$limit));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private function assignSql($folder){
|
|
|
// 被分配的
|
|
|
$assign = app()->request('assign');
|
|
|
$query = [];
|
|
|
$fids = [];
|
|
|
if(!empty($assign['email_id'])){
|
|
|
// 此处请求中的
|
|
|
$email = array_values(array_intersect($assign['email_id'],$this->getEmails('id')));
|
|
|
if($email){
|
|
|
$fids = $this->getFolderId($folder,$email);
|
|
|
// 有目录id和from
|
|
|
if($fids && !empty($assign['from'])){
|
|
|
if($folder=='发件箱'){
|
|
|
$query = [
|
|
|
'query' =>[
|
|
|
'bool' => [
|
|
|
'must' => [
|
|
|
['terms'=>['folder_id'=>$fids]],
|
|
|
['query_string'=>[
|
|
|
'query'=> implode(' ',$assign['from']),
|
|
|
'default_field'=>'to'
|
|
|
]]
|
|
|
]
|
|
|
]
|
|
|
]
|
|
|
];
|
|
|
}else{
|
|
|
$query = [
|
|
|
'query' =>[
|
|
|
'bool' => [
|
|
|
'must' => [
|
|
|
['terms'=>['folder_id'=>$fids]],
|
|
|
['terms'=>['from.email'=>$assign['from']]],
|
|
|
]
|
|
|
]
|
|
|
]
|
|
|
];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 返回 不在assign中的目录
|
|
|
$afids = array_values(array_diff($this->getFolderId($folder),$fids));
|
|
|
|
|
|
if($query && $afids){
|
|
|
$query = [
|
|
|
'query' =>[
|
|
|
'bool' => [
|
|
|
'must' => [
|
|
|
$query
|
|
|
],
|
|
|
'should' =>[
|
|
|
['terms'=>['folder_id'=>$afids]]
|
|
|
]
|
|
|
]
|
|
|
]
|
|
|
];
|
|
|
}else if($afids){
|
|
|
return [
|
|
|
'query' =>[
|
|
|
'bool' => [
|
|
|
'must' =>[
|
|
|
['terms'=>['folder_id'=>$afids]]
|
|
|
]
|
|
|
]
|
|
|
]
|
|
|
];
|
|
|
}else if($query&&!$afids){
|
|
|
return $query;
|
|
|
}
|
|
|
return ['term'=>['folder_id'=> -1]];
|
|
|
|
|
|
}
|
|
|
|
|
|
return ['terms'=>['folder_id'=> $this->getFolderId($folder)]];
|
|
|
|
|
|
}
|
|
|
private function assignSql2(){
|
|
|
// 被分配的
|
|
|
$assign = app()->request('assign');
|
|
|
$sql = '';
|
|
|
$query = [];
|
|
|
if(!empty($assign['email_id'])){
|
|
|
// 分配的联系人
|
|
|
$email = array_values(array_intersect($assign['email_id'],$this->getEmails('id')));
|
|
|
if($email&&!empty($assign['from'])){
|
|
|
$query['must'] = [
|
|
|
['terms'=>['email_id'=>$email]]
|
|
|
];
|
|
|
$query['must'][] = [
|
|
|
'query'=>[
|
|
|
'bool'=>[
|
|
|
'must'=>[
|
|
|
['terms'=>['from.email'=>$assign['from']]]
|
|
|
],
|
|
|
'should'=>[
|
|
|
"query_string" =>[
|
|
|
"query" => implode(' ',$assign['from']),
|
|
|
'default_field' => 'to'
|
|
|
]
|
|
|
]
|
|
|
]
|
|
|
]
|
|
|
];
|
|
|
}
|
|
|
|
|
|
// 分配的邮箱
|
|
|
$email2 = array_diff($this->getEmails('id'),$assign['email_id']);
|
|
|
if($email2){
|
|
|
if($query){
|
|
|
$query['must'][] = [
|
|
|
'query'=>[
|
|
|
'bool'=>[
|
|
|
'must'=>[
|
|
|
$query
|
|
|
],
|
|
|
'should'=>[
|
|
|
['terms'=>['email_id'=>$email2]]
|
|
|
]
|
|
|
]
|
|
|
]
|
|
|
];
|
|
|
return ['query'=>[
|
|
|
'bool'=> $query
|
|
|
]];
|
|
|
}
|
|
|
|
|
|
return ['query'=>[
|
|
|
'bool'=> [
|
|
|
'must'=>[
|
|
|
['terms'=>['email_id'=>$email2]]
|
|
|
]
|
|
|
]
|
|
|
]];
|
|
|
}
|
|
|
|
|
|
if($sql){
|
|
|
return ['query'=>[
|
|
|
'bool'=> $query
|
|
|
]];
|
|
|
}
|
|
|
|
|
|
|
|
|
return [
|
|
|
'query'=>[
|
|
|
'bool'=> [
|
|
|
'must'=>[['term'=>['email_id'=>-1]]]
|
|
|
]
|
|
|
]
|
|
|
];
|
|
|
}
|
|
|
|
|
|
// 默认
|
|
|
return dbWhere(['email_id'=>$this->getEmails('id')]).' and ';
|
|
|
|
|
|
}
|
|
|
private function assignSql3($folder){
|
|
|
// 被分配的
|
|
|
$assign = app()->request('assign');
|
|
|
$sql = '';
|
|
|
$fids = [];
|
|
|
if(!empty($assign['email_id'])){
|
|
|
// 此处请求中的
|
|
|
$email = array_diff($this->getEmails('id'),$assign['email_id']);
|
|
|
if($email){
|
|
|
$fids = $this->getFolderId($folder,$email);
|
|
|
// 有目录id和from
|
|
|
if($fids){
|
|
|
return dbWhere(['folder_id'=>$fids]).' and ';
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
return '`folder_id` = -1 and ';
|
|
|
|
|
|
}
|
|
|
|
|
|
return dbWhere(['folder_id'=>$this->getFolderId($folder)]).' and ';
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public function count(){
|
|
|
return [];
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
...
|
...
|
|