|
@@ -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
|
|