正在显示
7 个修改的文件
包含
149 行增加
和
34 行删除
| @@ -93,7 +93,11 @@ class Folder extends Base { | @@ -93,7 +93,11 @@ class Folder extends Base { | ||
| 93 | $origin_folder = $parent['origin_folder'].'/'.$origin_folder; | 93 | $origin_folder = $parent['origin_folder'].'/'.$origin_folder; | 
| 94 | } | 94 | } | 
| 95 | 95 | ||
| 96 | - $formData['folder'] = str_replace(["'",'"','/','\\','&','*','(',')'],'',$formData['folder']); | 96 | + $formData['folder'] = str_replace( | 
| 97 | + ["'",'"','/','\\','&','*','(',')','{','}','|','$','@','!','#','%','^','<','>','?','`','~','[',']'], | ||
| 98 | + '', | ||
| 99 | + $formData['folder'] | ||
| 100 | + ); | ||
| 97 | 101 | ||
| 98 | // 判断文件夹是否存在 | 102 | // 判断文件夹是否存在 | 
| 99 | $has = db()->count(folderSql::has( | 103 | $has = db()->count(folderSql::has( | 
| @@ -132,14 +136,22 @@ class Folder extends Base { | @@ -132,14 +136,22 @@ class Folder extends Base { | ||
| 132 | 'folder' => $formData['folder'], | 136 | 'folder' => $formData['folder'], | 
| 133 | 'origin_folder' => $origin_folder, | 137 | 'origin_folder' => $origin_folder, | 
| 134 | 'uuid' => md5($email['id'].$origin_folder), | 138 | 'uuid' => md5($email['id'].$origin_folder), | 
| 135 | - ]); | 139 | + ],false); | 
| 136 | 140 | ||
| 137 | if(!$id){ | 141 | if(!$id){ | 
| 138 | app()->e('folder_create_save_error'); | 142 | app()->e('folder_create_save_error'); | 
| 139 | } | 143 | } | 
| 140 | 144 | ||
| 141 | - // 返回数据 | ||
| 142 | - app()->_json(db()->first(folderSql::first($id))); | 145 | + // 查询 | 
| 146 | + $folders = db()->all( | ||
| 147 | + \Model\folderSql::all( | ||
| 148 | + $email['id'], | ||
| 149 | + '`id`,`folder`,`pid`,`exsts`,`unseen`,`email_id`' | ||
| 150 | + ) | ||
| 151 | + ); | ||
| 152 | + | ||
| 153 | + | ||
| 154 | + return list_to_tree($folders); | ||
| 143 | 155 | ||
| 144 | } | 156 | } | 
| 145 | 157 | 
| @@ -186,17 +186,81 @@ class Home extends Base { | @@ -186,17 +186,81 @@ class Home extends Base { | ||
| 186 | 186 | ||
| 187 | 187 | ||
| 188 | /** | 188 | /** | 
| 189 | - * 邮件回收站,进行回收,恢复邮件 | 189 | + * 邮件移动 | 
| 190 | * @author:dc | 190 | * @author:dc | 
| 191 | * @time 2023/3/21 11:41 | 191 | * @time 2023/3/21 11:41 | 
| 192 | */ | 192 | */ | 
| 193 | - public function recycle(){ | ||
| 194 | - $this->setFlags('deleted'); | 193 | + public function move(){ | 
| 194 | + $emails = $this->getEmails(); | ||
| 195 | + | ||
| 196 | + $mail_ids = app()->request('mail_ids'); | ||
| 197 | + foreach ($mail_ids as $k=>$id){ | ||
| 198 | + if(!is_numeric($id)){ | ||
| 199 | + unset($mail_ids[$k]); | ||
| 200 | + } | ||
| 201 | + } | ||
| 202 | + // 移动到的文件夹 | ||
| 203 | + $folder = app()->request('folder'); | ||
| 204 | + | ||
| 205 | + $data = db()->all(listsSql::first(dbWhere(['id'=>$mail_ids,'email_id'=>array_column($emails,'id')]),'`id`,`uid`,`email_id`,`folder_id`')); | ||
| 206 | + if($data){ | ||
| 207 | + // 查询邮箱 | ||
| 208 | + $emails = array_column($emails,null,'id'); | ||
| 209 | + $uids = []; | ||
| 210 | + foreach ($data as $datum){ | ||
| 211 | + if(empty($uids[$datum['email_id']])){ | ||
| 212 | + $uids[$datum['email_id']][$datum['folder_id']] = []; | ||
| 213 | + } | ||
| 214 | + $uids[$datum['email_id']][$datum['folder_id']][] = [ | ||
| 215 | + 'uid' => $datum['uid'], | ||
| 216 | + 'id' => $datum['id'], | ||
| 217 | + ]; | ||
| 218 | + } | ||
| 219 | + | ||
| 220 | + foreach ($uids as $eid=>$arr){ | ||
| 221 | + foreach ($arr as $fid=>$uid){ | ||
| 222 | + // 查询目录 | ||
| 223 | + $folder = db()->first(folderSql::first($fid)); | ||
| 224 | + if($folder){ | ||
| 225 | + // 开始远程 | ||
| 226 | + $mailInstance = new Mail($emails[$eid]['email'],base64_decode($emails[$eid]['password']),$emails[$eid]['imap']); | ||
| 227 | + | ||
| 228 | + if($mailInstance->login()){ | ||
| 229 | + | ||
| 230 | + $mailInstance->move(); | ||
| 231 | + | ||
| 232 | + $mailInstance = null; | ||
| 233 | + // 更新数据 | ||
| 234 | +// db()->update(listsSql::$table,[ | ||
| 235 | +// $d => $fv | ||
| 236 | +// ],dbWhere([ | ||
| 237 | +// 'id' => array_column($uid,'id') | ||
| 238 | +// ])); | ||
| 239 | + } | ||
| 240 | + | ||
| 241 | + } | ||
| 242 | + $folder = null; | ||
| 243 | + } | ||
| 244 | + } | ||
| 245 | + | ||
| 246 | + } | ||
| 247 | + | ||
| 248 | + | ||
| 249 | + app()->_json([ | ||
| 250 | + 'mail_id' => $mail_ids | ||
| 251 | + ]); | ||
| 195 | } | 252 | } | 
| 196 | 253 | ||
| 197 | 254 | ||
| 198 | 255 | ||
| 199 | 256 | ||
| 257 | + /** | ||
| 258 | + * 远程标签 | ||
| 259 | + * @param $d | ||
| 260 | + * @throws \Lib\Err | ||
| 261 | + * @author:dc | ||
| 262 | + * @time 2023/3/21 14:28 | ||
| 263 | + */ | ||
| 200 | private function setFlags($d){ | 264 | private function setFlags($d){ | 
| 201 | $emails = $this->getEmails(); | 265 | $emails = $this->getEmails(); | 
| 202 | 266 | ||
| @@ -210,7 +274,7 @@ class Home extends Base { | @@ -210,7 +274,7 @@ class Home extends Base { | ||
| 210 | $fv = (int) app()->request($d); | 274 | $fv = (int) app()->request($d); | 
| 211 | $fv = $fv ? 1 : 0; | 275 | $fv = $fv ? 1 : 0; | 
| 212 | 276 | ||
| 213 | - $data = db()->all(listsSql::first(dbWhere(['id'=>$mail_ids,'email_id'=>array_column($emails,'id')]))); | 277 | + $data = db()->all(listsSql::first(dbWhere(['id'=>$mail_ids,'email_id'=>array_column($emails,'id')]),'`id`,`uid`,`email_id`,`folder_id`')); | 
| 214 | if($data){ | 278 | if($data){ | 
| 215 | // 查询邮箱 | 279 | // 查询邮箱 | 
| 216 | $emails = array_column($emails,null,'id'); | 280 | $emails = array_column($emails,null,'id'); | 
| @@ -241,10 +305,10 @@ class Home extends Base { | @@ -241,10 +305,10 @@ class Home extends Base { | ||
| 241 | break; | 305 | break; | 
| 242 | } | 306 | } | 
| 243 | // 回收站,已删 未删,软删 | 307 | // 回收站,已删 未删,软删 | 
| 244 | - case 'deleted':{ | ||
| 245 | - $mailInstance->recycle(array_column($uid,'uid'),$folder['origin_folder'],$fv); | ||
| 246 | - break; | ||
| 247 | - } | 308 | +// case 'deleted':{ | 
| 309 | +// $mailInstance->recycle(array_column($uid,'uid'),$folder['origin_folder'],$fv); | ||
| 310 | +// break; | ||
| 311 | +// } | ||
| 248 | } | 312 | } | 
| 249 | 313 | ||
| 250 | $mailInstance = null; | 314 | $mailInstance = null; | 
| @@ -301,9 +301,26 @@ function start_now_mail(){ | @@ -301,9 +301,26 @@ function start_now_mail(){ | ||
| 301 | } | 301 | } | 
| 302 | 302 | ||
| 303 | 303 | ||
| 304 | +/** | ||
| 305 | + * 固定文件夹的名称,统一 | ||
| 306 | + * @param $folder | ||
| 307 | + * @return string | ||
| 308 | + * @author:dc | ||
| 309 | + * @time 2023/3/21 16:00 | ||
| 310 | + */ | ||
| 311 | +function folderAlias($folder){ | ||
| 312 | + $folder_map = [ | ||
| 313 | + 'INBOX' => '收件箱', | ||
| 314 | + // qq的 | ||
| 315 | + 'Sent Messages' => '发件箱', | ||
| 316 | + 'Drafts' => '草稿箱', | ||
| 317 | + 'Junk' => '垃圾箱', | ||
| 318 | + 'Deleted Messages' => '回收站', | ||
| 319 | + ]; | ||
| 304 | 320 | ||
| 321 | + return $folder_map[$folder]??$folder; | ||
| 305 | 322 | ||
| 306 | - | 323 | +} | 
| 307 | 324 | ||
| 308 | 325 | ||
| 309 | 326 | 
| @@ -65,8 +65,12 @@ class Mail { | @@ -65,8 +65,12 @@ class Mail { | ||
| 65 | $this->client->login("ssl://{$this->server}:993",$this->username,$this->password); | 65 | $this->client->login("ssl://{$this->server}:993",$this->username,$this->password); | 
| 66 | }catch (\Throwable $e){ | 66 | }catch (\Throwable $e){ | 
| 67 | if($pass_err && $e->getCode() == 403){ | 67 | if($pass_err && $e->getCode() == 403){ | 
| 68 | - // 登录失败了 , | ||
| 69 | - db()->update(\Model\emailSql::$table,['pwd_error'=>1],dbWhere(['email'=>$this->username])); | 68 | + // 一天中超过 3次失败说明密码错误了 | 
| 69 | + if(redis()->incr('email_login_error:'.md5($this->username),86400) > 3){ | ||
| 70 | + // 登录失败了 , | ||
| 71 | + db()->update(\Model\emailSql::$table,['pwd_error'=>1],dbWhere(['email'=>$this->username])); | ||
| 72 | + } | ||
| 73 | + return -1; | ||
| 70 | }else{ | 74 | }else{ | 
| 71 | logs($e->getMessage()); | 75 | logs($e->getMessage()); | 
| 72 | } | 76 | } | 
| @@ -74,6 +78,8 @@ class Mail { | @@ -74,6 +78,8 @@ class Mail { | ||
| 74 | return $e->getCode() == 403 ? 0 : -1; | 78 | return $e->getCode() == 403 ? 0 : -1; | 
| 75 | 79 | ||
| 76 | } | 80 | } | 
| 81 | + redis()->delete('email_login_error:'.md5($this->username)); | ||
| 82 | + | ||
| 77 | return 1; | 83 | return 1; | 
| 78 | } | 84 | } | 
| 79 | 85 | ||
| @@ -106,18 +112,21 @@ class Mail { | @@ -106,18 +112,21 @@ class Mail { | ||
| 106 | $folder['parseFolder'] = explode('/',$folder['parseFolder'])[1]; | 112 | $folder['parseFolder'] = explode('/',$folder['parseFolder'])[1]; | 
| 107 | } | 113 | } | 
| 108 | 114 | ||
| 109 | - try { | ||
| 110 | - $db->insert(folderSql::$table,[ | ||
| 111 | - 'email_id' => $email_id, | ||
| 112 | - 'folder' => $folder['parseFolder'], | ||
| 113 | - 'origin_folder' => $folder['folder'], | ||
| 114 | - 'uuid' => $uuid, | ||
| 115 | - 'pid' => $pid | ||
| 116 | - ],false); | ||
| 117 | - }catch (\Throwable $e){ | ||
| 118 | - // 这里就不处理失败了 | 115 | + if(!$db->count(folderSql::has(['uuid'=>$uuid]))){ | 
| 116 | + try { | ||
| 117 | + $db->insert(folderSql::$table,[ | ||
| 118 | + 'email_id' => $email_id, | ||
| 119 | + 'folder' => folderAlias($folder['parseFolder']), | ||
| 120 | + 'origin_folder' => $folder['folder'], | ||
| 121 | + 'uuid' => $uuid, | ||
| 122 | + 'pid' => $pid | ||
| 123 | + ],false); | ||
| 124 | + }catch (\Throwable $e){ | ||
| 125 | + // 这里就不处理失败了 | ||
| 126 | + } | ||
| 119 | } | 127 | } | 
| 120 | 128 | ||
| 129 | + | ||
| 121 | } | 130 | } | 
| 122 | // $db->commit(); | 131 | // $db->commit(); | 
| 123 | 132 | ||
| @@ -319,20 +328,24 @@ class Mail { | @@ -319,20 +328,24 @@ class Mail { | ||
| 319 | } | 328 | } | 
| 320 | 329 | ||
| 321 | /** | 330 | /** | 
| 322 | - * 回收站 | 331 | + * 移动邮件, | 
| 323 | * @param $uids | 332 | * @param $uids | 
| 324 | * @param $folder | 333 | * @param $folder | 
| 325 | - * @param $recycle | 334 | + * @return bool | 
| 335 | + * @throws \Exception | ||
| 326 | * @author:dc | 336 | * @author:dc | 
| 327 | - * @time 2023/3/21 13:41 | 337 | + * @time 2023/3/21 14:54 | 
| 328 | */ | 338 | */ | 
| 329 | - public function recycle($uids,$folder,$recycle){ | 339 | + public function move($uids,$folder,$to_folder){ | 
| 330 | // 选择目录 | 340 | // 选择目录 | 
| 331 | $status = $this->client->selectFolder($folder); | 341 | $status = $this->client->selectFolder($folder); | 
| 332 | 342 | ||
| 333 | - return $this->client->flags($uids,[Imap::FLAGS_DELETED],$recycle ? '+' : '-',true); | 343 | + return $this->client->folderRename($uids,[Imap::FLAGS_DELETED],$recycle ? '+' : '-',true); | 
| 334 | 344 | ||
| 335 | } | 345 | } | 
| 336 | 346 | ||
| 337 | 347 | ||
| 348 | + | ||
| 349 | + | ||
| 350 | + | ||
| 338 | } | 351 | } | 
| @@ -94,9 +94,9 @@ class listsSql { | @@ -94,9 +94,9 @@ class listsSql { | ||
| 94 | * @author:dc | 94 | * @author:dc | 
| 95 | * @time 2023/3/17 16:24 | 95 | * @time 2023/3/17 16:24 | 
| 96 | */ | 96 | */ | 
| 97 | - public static function first(string $where):string { | 97 | + public static function first(string $where,$filed='*'):string { | 
| 98 | 98 | ||
| 99 | - return "select * from `".self::$table."` where ".$where; | 99 | + return "select {$filed} from `".self::$table."` where ".$where; | 
| 100 | } | 100 | } | 
| 101 | 101 | ||
| 102 | 102 | 
| @@ -31,8 +31,8 @@ return [ | @@ -31,8 +31,8 @@ return [ | ||
| 31 | 'sync' => [\Controller\Home::class, 'sync'], | 31 | 'sync' => [\Controller\Home::class, 'sync'], | 
| 32 | // 标记为已读 | 32 | // 标记为已读 | 
| 33 | 'seen_2_unseen' => [\Controller\Home::class, 'seen_2_unseen'], | 33 | 'seen_2_unseen' => [\Controller\Home::class, 'seen_2_unseen'], | 
| 34 | - // 回收站,邮件删除,非真实删除 | ||
| 35 | - 'recycle' => [\Controller\Home::class, 'recycle'], | 34 | + // 邮件移动文件夹 | 
| 35 | + 'move' => [\Controller\Home::class, 'move'], | ||
| 36 | 36 | ||
| 37 | 37 | ||
| 38 | 38 | 
- 
请 注册 或 登录 后发表评论
