<?php namespace Event; use Lib\Imap\Parse\MessageItem; use Model\emailSql; use Model\folderSql; use Model\listsSql; use Swlib\Saber; use Swlib\SaberGM; /** * 邮件同步成功的事件 * @author:dc * @time 2024/8/22 15:47 * Class syncMail * @package Event */ class SyncMail { /** * @var \Lib\Db|\Lib\DbPool */ private $db; public function __construct(int $id, array $data) { // if(php_sapi_name() == 'cli'){ $this->db = db(); // 是否是预热邮件 aicc专用 if(!empty($header['Aicc-Hot-Mail']) || !empty($header['aicc-hot-mail'])){ return $this->hot($id); } // 是否在指定文件夹内 $f = $this->db->value(folderSql::first($data['folder_id'],'folder')); if(!$f){ return true; } $f = folderAlias($f); if($f=='发件箱'){ if(empty($data['to_name'])){ $data['to_name'] = []; } $data['to_name'] = is_array($data['to_name'])?$data['to_name']:json_decode($data['to_name']); $w = ['email' => array_map('strtolower',array_column($data['to_name'],'email'))]; }else{ $w = ['email' => strtolower($data['from'])]; } // 是否在 预热邮箱中 if($w['email'] && $this->db->count('select count(*) from `hot_mail` where '.dbWhere($w))){ return $this->hot($id); } // 不是预热邮箱 if($f=='收件箱'){ $this->auto_mail($id,$data); $this->black_mail($id,$data); // 邮件过滤 这些邮箱都是系统邮箱 // if(!$this->checkEmail($data['from']) && !$this->checkSubject($data['subject'])){ //只提醒re if(stripos(trim($data['subject']),'re:')===0){ // 通知黑格 2024-08-22 新上 这个是异步的不会阻塞当前进程 try { SaberGM::post('https://fob.ai.cc/api/email_new_push',[ 'sign' => md5(date('ymd').'fob.ai.cc.email'), 'id' => $id, 'subject' => $data['subject'], 'udate' => $data['udate'], 'from' => $data['from'], 'tos' => array_column($data['to_name'],'email') ]); }catch (\Throwable $e){ // 就算异常了也不在推送了 } } } // } } private function hot($id){ return $this->db->update(listsSql::$table,['is_hots'=>1],dbWhere(['id'=>$id])); } /** * 自动回复邮箱 * @param $id * @param $data * @author:dc * @time 2024/9/12 15:29 */ private function auto_mail($id,$data){ $filter = redis()->get('ai_email_filter_lists',[]); if(!$filter || !is_array($filter)){ $filter = '2 Automatic reply 2 Delivery 2 Automatische Antwort 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 2 automatique 2 Reply auto 2 automatic 2 Request received 2 Automatisch 2 Unzustellbar 2 Notification 2 Invitation 2 Automatyczna 2 代开 2 expired'; $filter = explode("\n",$filter); $filter = array_map(function ($v){ list($t,$str) = [ intval(mb_substr($v,0,1)), trim(mb_substr($v,1,99)), ]; return [$t,$str]; },$filter); } foreach ($filter as $f){ $t = $f[0]??''; // 类型 $str = $f[1]??''; // 值 if(!$str) continue; $haystack = ''; if($t==2){ $haystack = $data['subject']; }elseif ($t==1){ $haystack = $data['from']; } if(stripos($haystack,$str)!==false){ try { $this->db->create('lists_auto',['list_id'=>$id],false); }catch (\Throwable $e){} break; } } } /** * 黑名单邮箱,直接delete * @param $id * @param $data * @author:dc * @time 2024/9/12 15:29 */ private function black_mail($id,$data){ if(!empty($data['from'])){ // 是否是ai邮件 if($this->db->count("select count(*) from `hot_mail` where ".dbWhere([ 'email'=> $this->db->value(emailSql::first($data['email_id'],'`email`')) ]))){ // 是否在黑名单中 if($this->db->count("select count(*) from `ai_black_email` where ".dbWhere(['email'=>$data['from']]))){ $this->db->update(listsSql::$table,['deleted'=>1],dbWhere(['id'=>$id])); } } } } }