SyncMail.php 3.4 KB
<?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)
    {

            $this->db = db();

            if($data['is_hots']){
                return true;
            }


            // 是否在指定文件夹内
            $f = $this->db->value(folderSql::first($data['folder_id'],'folder'));
            if(!$f){
                return true;
            }
            $f = folderAlias($f);


            // 不是预热邮箱
            if($f=='收件箱'){

                // $this->auto_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){
                        // 就算异常了也不在推送了
                    }

                }


            }


    }



    /**
     * 自动回复邮箱
     * @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;
            }
        }



    }



}