| 
 | 
 | 
 <?php
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 use Model\listsSql;
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 /**
 | 
| 
 | 
 | 
  * 自动回复的邮件
 | 
| 
 | 
 | 
  * @author:dc
 | 
| 
 | 
 | 
  * @time 2024/9/6 17:09
 | 
| 
 | 
 | 
  * Class HotMail
 | 
| 
 | 
 | 
  */
 | 
| 
 | 
 | 
 class AutoMail {
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     public function __construct(){
 | 
| 
 | 
 | 
         $this->db = db();
 | 
| 
 | 
 | 
         $this->start();
 | 
| 
 | 
 | 
     }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     /**
 | 
| 
 | 
 | 
      * shopk那边的预热邮箱
 | 
| 
 | 
 | 
      * @var array
 | 
| 
 | 
 | 
      */
 | 
| 
 | 
 | 
     private $shopkHotEmail = [];
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     /**
 | 
| 
 | 
 | 
      * @var \Lib\Db|\Lib\DbPool
 | 
| 
 | 
 | 
      */
 | 
| 
 | 
 | 
     private $db;
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     private $fids = [];
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     /**
 | 
| 
 | 
 | 
      * @author:dc
 | 
| 
 | 
 | 
      * @time 2024/7/18 14:04
 | 
| 
 | 
 | 
      */
 | 
| 
 | 
 | 
     private function start(){
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         $this->fids = $this->db->all("select `id` from `folders` where `folder` = '收件箱'");
 | 
| 
 | 
 | 
         $this->fids = array_column($this->fids,'id');
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         if(redis()->add('auto_mail_sync2',1,60)){
 | 
| 
 | 
 | 
             echo '正在计算数据';
 | 
| 
 | 
 | 
             $maxId = $this->db->value("select `id` from `lists` order by `id` desc limit 1");
 | 
| 
 | 
 | 
             $id = 0;
 | 
| 
 | 
 | 
             while (1){
 | 
| 
 | 
 | 
                 $ids = [];
 | 
| 
 | 
 | 
                 for ($i=0;$i<1000;$i++){
 | 
| 
 | 
 | 
                     $ids[] = $i+$id;
 | 
| 
 | 
 | 
                 }
 | 
| 
 | 
 | 
                 $id = end($ids);
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
                 redis()->rPush('auto_check_ids',implode(',',$ids));
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
                 if($id>$maxId){
 | 
| 
 | 
 | 
                     break;
 | 
| 
 | 
 | 
                 }
 | 
| 
 | 
 | 
             }
 | 
| 
 | 
 | 
             echo '计算完成';
 | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         while (1){
 | 
| 
 | 
 | 
             $ids = redis()->lPop('auto_check_ids');
 | 
| 
 | 
 | 
             if($ids){
 | 
| 
 | 
 | 
                 $ids = explode(',',$ids);
 | 
| 
 | 
 | 
                 $this->run($ids);
 | 
| 
 | 
 | 
             }else{
 | 
| 
 | 
 | 
                 echo '等待'.PHP_EOL;
 | 
| 
 | 
 | 
                 co::sleep(2);
 | 
| 
 | 
 | 
             }
 | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     private $filter = [
 | 
| 
 | 
 | 
         ['2','Automatic reply'],
 | 
| 
 | 
 | 
         ['2','Delivery'],
 | 
| 
 | 
 | 
         ['2','Automatische Antwort:'],
 | 
| 
 | 
 | 
         ['2','Automatic_reply'],
 | 
| 
 | 
 | 
         ['2','Undeliverable'],
 | 
| 
 | 
 | 
         ['2','Failure'],
 | 
| 
 | 
 | 
         ['2','Undelivered'],
 | 
| 
 | 
 | 
         ['1','noreply'],
 | 
| 
 | 
 | 
         ['1','postmaster'],
 | 
| 
 | 
 | 
         ['1','email-notifications'],
 | 
| 
 | 
 | 
         ['1','mailer-daemon'],
 | 
| 
 | 
 | 
         ['1','no-reply'],
 | 
| 
 | 
 | 
         ['2','自动回复'],
 | 
| 
 | 
 | 
         ['2','Returned mail'],
 | 
| 
 | 
 | 
         ['2','Autosvar'],
 | 
| 
 | 
 | 
         ['2','Out Of Office Re'],
 | 
| 
 | 
 | 
         ['2','Change_of_email_address'],
 | 
| 
 | 
 | 
         ['2','delivered']
 | 
| 
 | 
 | 
     ];
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     private function run($id){
 | 
| 
 | 
 | 
         $list = $this->db->all(\Model\listsSql::all(dbWhere(['id'=>$id]),'`id`,`from`,`subject`,`folder_id`'));
 | 
| 
 | 
 | 
         foreach ($list as $item){
 | 
| 
 | 
 | 
             // 必须是收件箱
 | 
| 
 | 
 | 
             if(in_array($item['folder_id'],$this->fids)){
 | 
| 
 | 
 | 
                 foreach ($this->filter as $f){
 | 
| 
 | 
 | 
                     list($t,$str) = $f;
 | 
| 
 | 
 | 
                     $haystack = '';
 | 
| 
 | 
 | 
                     if($t==2){
 | 
| 
 | 
 | 
                         $haystack = $item['subject'];
 | 
| 
 | 
 | 
                     }elseif ($t==1){
 | 
| 
 | 
 | 
                         $haystack = $item['from'];
 | 
| 
 | 
 | 
                     }
 | 
| 
 | 
 | 
                     if(stripos($haystack,$str)!==false){
 | 
| 
 | 
 | 
                         if(!$this->db->count("select count(*) from `lists_auto` where `list_id` = ".$item['id'])){
 | 
| 
 | 
 | 
                             $this->db->insert('`lists_auto`',['list_id'=>$item['id']],false);
 | 
| 
 | 
 | 
                             echo "插入数据 ".$item['id']."\n";
 | 
| 
 | 
 | 
                         }
 | 
| 
 | 
 | 
                     }
 | 
| 
 | 
 | 
                 }
 | 
| 
 | 
 | 
             }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
         }
 | 
| 
 | 
 | 
     }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 swoole_set_process_name('auto-reply-run-man');
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 $pm = new Swoole\Process\Manager();
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 $pm->addBatch(2,function (){
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     swoole_set_process_name('auto-reply-email-run');
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
     include_once "../vendor/autoload.php";
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 //    while(1){
 | 
| 
 | 
 | 
     new AutoMail();
 | 
| 
 | 
 | 
     // 执行完了暂停5分钟在执行
 | 
| 
 | 
 | 
     sleep(40);
 | 
| 
 | 
 | 
 //    }
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 },true);
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
 $pm->start();
 | 
| 
 | 
 | 
 
 | 
| 
 | 
 | 
  | 
...
 | 
...
 | 
 |