作者 邓超

1

@@ -200,7 +200,10 @@ class Home extends Base { @@ -200,7 +200,10 @@ class Home extends Base {
200 } 200 }
201 } 201 }
202 // 移动到的文件夹 202 // 移动到的文件夹
203 - $folder = app()->request('folder'); 203 + $to_folder = app()->request('folder');
  204 + if(empty($to_folder)){
  205 + app()->e('folder_move_error');
  206 + }
204 207
205 $data = db()->all(listsSql::first(dbWhere(['id'=>$mail_ids,'email_id'=>array_column($emails,'id')]),'`id`,`uid`,`email_id`,`folder_id`')); 208 $data = db()->all(listsSql::first(dbWhere(['id'=>$mail_ids,'email_id'=>array_column($emails,'id')]),'`id`,`uid`,`email_id`,`folder_id`'));
206 if($data){ 209 if($data){
@@ -218,29 +221,33 @@ class Home extends Base { @@ -218,29 +221,33 @@ class Home extends Base {
218 } 221 }
219 222
220 foreach ($uids as $eid=>$arr){ 223 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()){ 224 + // 查询需要移动的文件夹
  225 + $to_origin_folder = db()->first(folderSql::first(['email_id'=>$eid,'folder'=>$to_folder]));
  226 + if($to_origin_folder){
  227 + foreach ($arr as $fid=>$uid){
  228 + // 查询目录
  229 + $folder = db()->first(folderSql::first($fid));
  230 + if($folder){
  231 + // 开始远程
  232 + $mailInstance = new Mail($emails[$eid]['email'],base64_decode($emails[$eid]['password']),$emails[$eid]['imap']);
  233 +
  234 + if($mailInstance->login()){
  235 + // TODO:: 这个过程无法保证原子性。没办法
  236 + // 先复制
  237 + $ret = $mailInstance->move(array_column($uid,'uid'),$folder['origin_folder'],$to_origin_folder['origin_folder']);
  238 + if($ret){
  239 + $uret = db()->update(listsSql::$table,['deleted'=>1],dbWhere(['id'=>array_column($uid,'id')]));
  240 + }
229 241
230 - $mailInstance->move(); 242 + $mailInstance = null;
  243 + }
231 244
232 - $mailInstance = null;  
233 - // 更新数据  
234 -// db()->update(listsSql::$table,[  
235 -// $d => $fv  
236 -// ],dbWhere([  
237 -// 'id' => array_column($uid,'id')  
238 -// ]));  
239 } 245 }
240 - 246 + $folder = null;
241 } 247 }
242 - $folder = null;  
243 } 248 }
  249 +
  250 +
244 } 251 }
245 252
246 } 253 }
@@ -143,7 +143,10 @@ function dbWhere(array $where, string $ar = 'and'):string{ @@ -143,7 +143,10 @@ function dbWhere(array $where, string $ar = 'and'):string{
143 foreach ($where as $f=>$v){ 143 foreach ($where as $f=>$v){
144 if(is_array($v)){ 144 if(is_array($v)){
145 $v = array_map(function ($n){ 145 $v = array_map(function ($n){
146 - return "'".addslashes($n)."'"; 146 + if (is_string($n)){
  147 + return "'".addslashes($n)."'";
  148 + }
  149 + return $n;
147 },$v); 150 },$v);
148 if(count($v)===1){ 151 if(count($v)===1){
149 // 只有一个值时就是 = 152 // 只有一个值时就是 =
@@ -153,7 +156,7 @@ function dbWhere(array $where, string $ar = 'and'):string{ @@ -153,7 +156,7 @@ function dbWhere(array $where, string $ar = 'and'):string{
153 } 156 }
154 157
155 }else{ 158 }else{
156 - $sql[] = "`{$f}` = '".addslashes($v)."'"; 159 + $sql[] = "`{$f}` = '". (is_string($v) ? addslashes($v): $v) ."'";
157 } 160 }
158 161
159 } 162 }
@@ -318,6 +321,14 @@ function folderAlias($folder){ @@ -318,6 +321,14 @@ function folderAlias($folder){
318 'Deleted Messages' => '回收站', 321 'Deleted Messages' => '回收站',
319 ]; 322 ];
320 323
  324 +
  325 + foreach ($folder_map as $key=>$name){
  326 + if(strtolower($folder) == strtolower($key)){
  327 + return $name;
  328 + }
  329 + }
  330 +
  331 +
321 return $folder_map[$folder]??$folder; 332 return $folder_map[$folder]??$folder;
322 333
323 } 334 }
@@ -32,6 +32,7 @@ return [ @@ -32,6 +32,7 @@ return [
32 'folder_delete_exist_child' => '无法删除带有子文件夹的目录', 32 'folder_delete_exist_child' => '无法删除带有子文件夹的目录',
33 'folder_delete_exist_mail' => '无法删除存在邮件的目录', 33 'folder_delete_exist_mail' => '无法删除存在邮件的目录',
34 'folder_delete_error' => '文件夹删除失败', 34 'folder_delete_error' => '文件夹删除失败',
  35 + 'folder_move_error' => '请选择目标文件夹',
35 36
36 'sync_request_param_error' => '同步请求参数异常', 37 'sync_request_param_error' => '同步请求参数异常',
37 38
@@ -28,12 +28,24 @@ class DbPool { @@ -28,12 +28,24 @@ class DbPool {
28 * @time 2023/2/13 9:12 28 * @time 2023/2/13 9:12
29 */ 29 */
30 public function getClient(){ 30 public function getClient(){
  31 + if(!$this->client){
  32 + $this->connect();
  33 + }
31 return $this->client; 34 return $this->client;
32 } 35 }
33 36
34 37
35 public function __construct() 38 public function __construct()
36 { 39 {
  40 + $this->connect();
  41 + }
  42 +
  43 + /**
  44 + * 连接sql
  45 + * @author:dc
  46 + * @time 2023/3/23 9:14
  47 + */
  48 + public function connect(){
37 try { 49 try {
38 $this->client = new \PDO( 50 $this->client = new \PDO(
39 'mysql:charset=utf8mb4;dbname='.DB_DATABASE.';host='.DB_HOST.';port='.DB_PORT, 51 'mysql:charset=utf8mb4;dbname='.DB_DATABASE.';host='.DB_HOST.';port='.DB_PORT,
@@ -42,13 +54,12 @@ class DbPool { @@ -42,13 +54,12 @@ class DbPool {
42 [ 54 [
43 \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, 55 \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
44 \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'", 56 \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'",
45 - \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, 57 + \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
46 ] 58 ]
47 ); 59 );
48 }catch (\PDOException $e){ 60 }catch (\PDOException $e){
49 - 61 + logs($e->getMessage());
50 } 62 }
51 -  
52 } 63 }
53 64
54 65
@@ -70,7 +81,7 @@ class DbPool { @@ -70,7 +81,7 @@ class DbPool {
70 $timer = microtime(true); 81 $timer = microtime(true);
71 } 82 }
72 83
73 - $query = $this->client->prepare($sql); 84 + $query = $this->getClient()->prepare($sql);
74 85
75 $ret = $query->execute($params); 86 $ret = $query->execute($params);
76 87
@@ -165,7 +176,7 @@ class DbPool { @@ -165,7 +176,7 @@ class DbPool {
165 $query = $this->query([$sql,$data]); 176 $query = $this->query([$sql,$data]);
166 177
167 if($query){ 178 if($query){
168 - return $this->client->lastInsertId(); 179 + return $this->getClient()->lastInsertId();
169 } 180 }
170 181
171 return 0; 182 return 0;
@@ -266,7 +277,7 @@ class DbPool { @@ -266,7 +277,7 @@ class DbPool {
266 * @time 2023/2/17 11:35 277 * @time 2023/2/17 11:35
267 */ 278 */
268 public function transaction(){ 279 public function transaction(){
269 - $this->client->beginTransaction(); 280 + $this->getClient()->beginTransaction();
270 } 281 }
271 282
272 /** 283 /**
@@ -275,7 +286,7 @@ class DbPool { @@ -275,7 +286,7 @@ class DbPool {
275 * @time 2023/2/17 11:35 286 * @time 2023/2/17 11:35
276 */ 287 */
277 public function rollBack(){ 288 public function rollBack(){
278 - $this->client->rollBack(); 289 + $this->getClient()->rollBack();
279 } 290 }
280 291
281 /** 292 /**
@@ -284,7 +295,7 @@ class DbPool { @@ -284,7 +295,7 @@ class DbPool {
284 * @time 2023/2/17 11:35 295 * @time 2023/2/17 11:35
285 */ 296 */
286 public function commit(){ 297 public function commit(){
287 - $this->client->commit(); 298 + $this->getClient()->commit();
288 } 299 }
289 300
290 301
@@ -494,12 +494,66 @@ class Imap { @@ -494,12 +494,66 @@ class Imap {
494 } 494 }
495 495
496 /** 496 /**
  497 + * 复制
  498 + * @param array $uids
  499 + * @param string $folder
  500 + * @return bool
  501 + * @throws \Exception
  502 + * @author:dc
  503 + * @time 2023/3/22 16:35
  504 + */
  505 + public function copy(array $uids,string $folder){
  506 +
  507 + $uids = implode(',',$uids);
  508 +
  509 + $res = $this->request("UID COPY {$uids} \"{$folder}\"");
  510 +
  511 + if ($res[0] == 'ok'){
  512 + return true;
  513 + }
  514 +
  515 + throw new \Exception("copy error:".end($res[1]));
  516 + }
  517 +
  518 + /**
497 * 移动邮件 519 * 移动邮件
  520 + * @param array $uids
  521 + * @param string $folder
  522 + * @return bool
  523 + * @throws \Exception
498 * @author:dc 524 * @author:dc
499 - * @time 2023/3/21 14:55 525 + * @time 2023/3/22 18:06
500 */ 526 */
501 - public function move(){ 527 + public function move(array $uids,string $folder){
  528 +
  529 + $uids = implode(',',$uids);
  530 +
  531 + $res = $this->request("UID MOVE {$uids} \"{$folder}\"");
  532 +
  533 + if ($res[0] == 'ok'){
  534 + return true;
  535 + }
  536 +
  537 + throw new \Exception("move error:".end($res[1]));
  538 + }
502 539
  540 + /**
  541 + * 删除邮件
  542 + * @param array $uids
  543 + * @author:dc
  544 + * @time 2023/3/22 17:51
  545 + */
  546 + public function delete(array $uids){
  547 +
  548 +// $uids = implode(',',$uids);
  549 +//
  550 +// $res = $this->request("UID DELETE {$uids} ");
  551 +//
  552 +// if ($res[0] == 'ok'){
  553 +// return true;
  554 +// }
  555 +//
  556 +// throw new \Exception("delete error:".end($res[1]));
503 } 557 }
504 558
505 559
@@ -328,23 +328,58 @@ class Mail { @@ -328,23 +328,58 @@ class Mail {
328 } 328 }
329 329
330 /** 330 /**
331 - * 移动邮件, 331 + * 复制
332 * @param $uids 332 * @param $uids
333 * @param $folder 333 * @param $folder
  334 + * @param $to_folder
334 * @return bool 335 * @return bool
335 * @throws \Exception 336 * @throws \Exception
336 * @author:dc 337 * @author:dc
337 - * @time 2023/3/21 14:54 338 + * @time 2023/3/22 16:38
  339 + */
  340 + public function copy($uids,$folder,$to_folder){
  341 + // 选择目录
  342 + $status = $this->client->selectFolder($folder);
  343 +
  344 + return $this->client->copy($uids,$to_folder);
  345 +
  346 + }
  347 +
  348 + /**
  349 + * 移动邮件
  350 + * @param $uids
  351 + * @param $folder
  352 + * @param $to_folder
  353 + * @return bool
  354 + * @throws \Exception
  355 + * @author:dc
  356 + * @time 2023/3/22 18:06
338 */ 357 */
339 public function move($uids,$folder,$to_folder){ 358 public function move($uids,$folder,$to_folder){
340 // 选择目录 359 // 选择目录
341 $status = $this->client->selectFolder($folder); 360 $status = $this->client->selectFolder($folder);
342 361
343 - return $this->client->folderRename($uids,[Imap::FLAGS_DELETED],$recycle ? '+' : '-',true); 362 + return $this->client->move($uids,$to_folder);
344 363
345 } 364 }
346 365
347 366
  367 +// /**
  368 +// * 删除
  369 +// * @param $uids
  370 +// * @param $folder
  371 +// * @return bool
  372 +// * @throws \Exception
  373 +// * @author:dc
  374 +// * @time 2023/3/22 17:52
  375 +// */
  376 +// public function delete($uids,$folder){
  377 +// // 选择目录
  378 +// $status = $this->client->selectFolder($folder);
  379 +//
  380 +// return $this->client->delete($uids);
  381 +// }
  382 +
348 383
349 384
350 385
@@ -43,9 +43,9 @@ class folderSql { @@ -43,9 +43,9 @@ class folderSql {
43 * @author:dc 43 * @author:dc
44 * @time 2023/3/14 11:49 44 * @time 2023/3/14 11:49
45 */ 45 */
46 - public static function first(array|string $where):string { 46 + public static function first(array|string $where,$filed = '*'):string {
47 $where = is_numeric($where) ? ['id'=>$where] : $where; 47 $where = is_numeric($where) ? ['id'=>$where] : $where;
48 - return "select * from `".self::$table."` where ".dbWhere($where); 48 + return "select {$filed} from `".self::$table."` where ".dbWhere($where)." limit 1";
49 } 49 }
50 50
51 51