作者 邓超

优化 同步

@@ -733,7 +733,7 @@ class Imap { @@ -733,7 +733,7 @@ class Imap {
733 }elseif($header2Body=='body'){ 733 }elseif($header2Body=='body'){
734 $filed = 'RFC822.TEXT'; 734 $filed = 'RFC822.TEXT';
735 }else{ 735 }else{
736 - $filed = 'UID FLAGS INTERNALDATE'; 736 + $filed = $header2Body;
737 } 737 }
738 738
739 // 读取数据 739 // 读取数据
@@ -194,29 +194,35 @@ class Mail { @@ -194,29 +194,35 @@ class Mail {
194 false 194 false
195 ); 195 );
196 196
  197 + if(!$status['EXISTS']){
  198 + return true;
  199 + }
197 200
198 - // 最后拉取的msgno  
199 - $lastMsgno = $db->value(listsSql::lastMsgno($email_id,$folder_id)); 201 + //
  202 + $nu = 100;
  203 + $msgno = 1;
  204 + while (true){
  205 + // 是否结束了
  206 + if($status['EXISTS'] < $msgno){
  207 + break;
  208 + }
200 209
201 - $nu = 20; 210 + $uids = $this->client->fetch(range($msgno,($msgno-1)+$nu),'UID');
  211 + if(!$uids){
  212 + break;
  213 + }
202 214
203 - if(!$lastMsgno){  
204 - $msgno = range(1,$nu);  
205 - }else{  
206 - $msgno = range($lastMsgno,$lastMsgno+$nu); 215 + $uids = array_column($uids,'UID');
  216 + $existsUids = $db->value(listsSql::getUids($email_id,$folder_id,$uids));
  217 + // 获取不存在数据库的uid
  218 + $uids = array_diff($uids,$existsUids);
207 219
208 - if($lastMsgno > $status['EXISTS']){  
209 - $msgno = range($status['EXISTS'] > $nu ? $status['EXISTS'] - $nu : 1,$status['EXISTS']);  
210 - }  
211 - // 一样就不拉新的  
212 - if($lastMsgno == $status['EXISTS']){  
213 - return true;  
214 - }  
215 - } 220 + $msgno += $nu;
216 221
  222 + // 开始同步
  223 + if($uids){
  224 + $results = $this->client->fetchHeader($uids,true);
217 225
218 - // 循环  
219 - $results = $this->client->fetchHeader($msgno);  
220 if($results && is_array($results)){ 226 if($results && is_array($results)){
221 // 表示已存在新邮件 227 // 表示已存在新邮件
222 if($folder == 'INBOX') redis()->incr('have_new_mail_'.$email_id,120); 228 if($folder == 'INBOX') redis()->incr('have_new_mail_'.$email_id,120);
@@ -230,11 +236,6 @@ class Mail { @@ -230,11 +236,6 @@ class Mail {
230 } 236 }
231 try { 237 try {
232 238
233 -  
234 -// if(empty($header['Subject'])){  
235 -// logs($result);  
236 -// }  
237 -  
238 // 没有收件人 239 // 没有收件人
239 if(!empty($header['To'])){ 240 if(!empty($header['To'])){
240 $header['To'] = MailFun::toOrFrom($header['To']); 241 $header['To'] = MailFun::toOrFrom($header['To']);
@@ -288,42 +289,35 @@ class Mail { @@ -288,42 +289,35 @@ class Mail {
288 continue; 289 continue;
289 } 290 }
290 291
291 - $results[$key] = $data;  
292 - }  
293 -  
294 - // 保存数据,这里其实不用再次写循环的。我想写一个  
295 - $uuids = $db->all(listsSql::hasUuid(array_column($results,'uuid')));  
296 - $uuids = $uuids ? array_column($uuids,null,'uuid') : [];  
297 -  
298 -// $db->transaction();  
299 - foreach ($results as $insert){  
300 - if(empty($uuids[$insert['uuid']])){  
301 - // 新增 292 + // 插入数据库
302 try { 293 try {
303 - $id = $db->insert(listsSql::$table,$insert); 294 + $id = $db->insert(listsSql::$table,$data);
  295 + if($id){
304 // 同步body内容 296 // 同步body内容
305 redis()->rPush('sync_email_body', [ 297 redis()->rPush('sync_email_body', [
306 'lists_id' => $id, 298 'lists_id' => $id,
307 'email_id' => $email_id, 299 'email_id' => $email_id,
308 'folder_id' => $folder_id, 300 'folder_id' => $folder_id,
309 'folder' => $folder, 301 'folder' => $folder,
310 - 'uid' => $insert['uid'], 302 + 'uid' => $data['uid'],
311 ]); 303 ]);
  304 + }
312 }catch (\Throwable $e){ 305 }catch (\Throwable $e){
313 306
314 } 307 }
315 308
  309 + }
316 310
317 - }else{  
318 - // 修改  
319 - $db->update(  
320 - listsSql::$table,  
321 - $insert,  
322 - dbWhere(['id'=>$uuids[$insert['uuid']]['id']])  
323 - ); 311 + // 结束操作了
  312 + if(redis()->get(SYNC_RUNNING_REDIS_KEY) == 'stop'){
  313 + break;
324 } 314 }
  315 +
  316 + }
  317 +
  318 + }
  319 +
325 } 320 }
326 -// $db->commit();  
327 321
328 // 更新数量 322 // 更新数量
329 $db->update( 323 $db->update(
@@ -332,14 +326,6 @@ class Mail { @@ -332,14 +326,6 @@ class Mail {
332 dbWhere(['id'=>$folder_id]), 326 dbWhere(['id'=>$folder_id]),
333 false 327 false
334 ); 328 );
335 - // 结束操作了  
336 -  
337 - if(redis()->get(SYNC_RUNNING_REDIS_KEY) != 'stop'){  
338 - // 再次调用  
339 - $this->syncMail($email_id,$folder_id,$folder,$db);  
340 - }  
341 -  
342 - }  
343 329
344 return true; 330 return true;
345 331
@@ -60,6 +60,19 @@ class listsSql { @@ -60,6 +60,19 @@ class listsSql {
60 } 60 }
61 61
62 /** 62 /**
  63 + * 获取已有的uid
  64 + * @param int $email_id
  65 + * @param int $folder_id
  66 + * @param array $uids
  67 + * @return string
  68 + * @author:dc
  69 + * @time 2023/4/23 16:54
  70 + */
  71 + public static function getUids(int $email_id, int $folder_id, array $uids){
  72 + return "select `uid` from `".static::$table."` where ".dbWhere(['email_id'=>$email_id,'folder_id'=>$folder_id,'uid'=>$uids]);
  73 + }
  74 +
  75 + /**
63 * 获取已存在的id 76 * 获取已存在的id
64 * @param $email_id 77 * @param $email_id
65 * @param $folder_id 78 * @param $folder_id