<?php namespace Event; 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($id,$header,$data) { $this->db = db(); // 是否是预热邮件 aicc专用 if(!empty($header['Aicc-Hot-Mail']) || !empty($header['aicc-hot-mail'])){ return $this->hot($id); } // 是否在指定文件夹内 $f = folderAlias($this->db->value(folderSql::first($data['folder_id'],'folder'))); 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_column($data['to_name'],'email')]; }else{ $w = ['email' =>$data['from']]; } // 是否在 预热邮箱中 if($this->db->count('select count(*) from `hot_mail` where '.dbWhere($w))){ return $this->hot($id); } // 不是预热邮箱 if($f=='收件箱'){ // mimecast@wsa.aero $filterEmail = ['mimecast@wsa.aero']; // 邮件过滤 这些邮箱都是系统邮箱 if(!in_array($data['from'],$filterEmail) && !preg_match("/^((no-?reply)|(postmaster)|(mailer-daemon)|(email-notifications)|(googleplay-noreply)|(postmaster-noreply)|(privacy-noreply))@/i",$data['from']) && !$this->checkSubject($data['subject'])){ // 通知黑格 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(json_decode($data['to_name'],1),'email') ]); }catch (\Throwable $e){ // 就算异常了也不在推送了 } } } } private function hot($id){ return $this->db->update(listsSql::$table,['is_hots'=>1],dbWhere(['id'=>$id])); } /** * 验证标题是否存在某些关键词 * @param string $subject * @return bool * @author:dc * @time 2024/8/24 15:09 */ public function checkSubject(string $subject){ $keys = [ 'Automatic reply: ', 'Delivery Failure', 'Automatische Antwort:', 'Automatic_reply:', ]; foreach ($keys as $key){ if(stripos($subject,$key)!==false){ return true; } } return false; } }