<?php namespace Controller\v2; use Controller\Base; use Lib\Mail\Mail; use Model\folderSql; use Model\listsSql; /** * @author:dc * @time 2023/2/13 11:28 * Class Home * @package Controller */ class Home extends Base { private function getFolderIds($email_id){ $folder_ids = app()->request('folder_ids',[],['intval','abs']); if(is_array($folder_ids)){ foreach ($folder_ids as $k=>$folder_id){ if(!$folder_id){ unset($folder_ids[$k]); } } if($folder_ids){ $folder_ids = array_values($folder_ids); } } // 默认查询 inbox if(!is_array($folder_ids) || !$folder_ids){ $folder = app()->request('folder','收件箱'); $folder_ids = db()->value( sprintf( "select `id` from `%s` where `email_id` = %d and `folder` = '%s'", folderSql::$table ,$email_id, addslashes($folder) ) ); $folder_ids = [$folder_ids]; } return $folder_ids; } /** * 邮件列表 针对aicc应用那边 * @author:dc * @time 2023/2/17 14:12 */ public function lists(){ $limit = app()->request('limit',20,['intval','abs']); $last_id = app()->request('last_id',0,['intval','abs']); $udate = app()->request('udate',0,'intval'); $where = ['email_id' => $this->getEmail('id')]; //目录 $where['folder_id'] = $this->getFolderIds($where['email_id']); $sql = "`id` > ".$last_id; if($udate){ $sql .= " and `udate` > ".$udate; } $lists = db()->all( sprintf( "select `id`,`subject`,`from`,`from_name`,`seen`,`udate`,`email_id` from `%s` where %s and %s order by `id` asc limit %d" ,listsSql::$table ,$sql ,dbWhere($where) ,$limit ) ); app()->_json(['data'=>$lists?:[]]); } /** * v2 版本 * 同步规定 时间 之后的邮件 * @return string * @throws \Lib\Err * @author:dc * @time 2023/8/2 16:19 */ public function sync(){ ignore_user_abort(true); set_time_limit(0); $email = $this->getEmail(); $udate = app()->request('udate',0,'intval'); if(!$udate){ return 'no udate'; } // 读取文件夹 $fids = $this->getFolderIds($email['id']); $folders = db()->all(folderSql::all($email['id'])); // 启动 协程 // 实例一个邮箱对象 $mail = new Mail($email['email'],base64_decode($email['password']),$email['imap']); // 登录 if($mail->login()!=1){ return '登录失败'; } if(!$folders){ $mail->syncFolder($email['id']); return 'sync folder'; } // 循环 文件夹 foreach ($folders as $folder){ // 是否在同步请求中 if(in_array($folder['id'],$fids)){ // 选择 文件夹 $mail->client->selectFolder($folder['origin_folder']); // 最后的时间 $maxudate = db()->value( sprintf( "select `udate` from `%s` where `email_id` = %d and `folder_id` = %d order by `udate` desc limit 1", listsSql::$table, $email['id'], $folder['id'] ) ); $udate = $udate > $maxudate ? $udate : $maxudate; // 通过时间来搜索uid $uids = $mail->client->search(['SINCE'=>date('d-M-Y',$udate)],true); if ($uids){ $us = []; foreach ($uids as $k=>$uid){ if(!isset($us[intval($k/100)])) $us[intval($k/100)] = []; $us[intval($k/100)][] = trim($uid); } foreach ($us as $u){ // 已有的uid $useuids = db()->all( sprintf( "select `uid` from `%s` where `email_id` = %d and `folder_id` = %d and `uid` in (%s)", listsSql::$table, $email['id'], $folder['id'], implode(',',$u) ) ); $useuids = $useuids ? array_column($useuids,'uid') : []; if($useuids){ // 删除多余的 foreach ($u as $k=>$ui){ if(in_array($ui,$useuids)){ unset($u[$k]); } } } if($u){ // 进行同步 $mail->syncUidEmail( array_values($u), $email['id'], $folder['origin_folder'], $folder['id'], [], [], db() ); } } } } } return 'ok'; } }