| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 | <?phpnamespace App\Jobs;use App\Mail\DefaultMail;use App\Repositories\EmailBatchRepository;use App\Repositories\EmailQueueRepository;use App\Repositories\EmailTemplateRepository;use Illuminate\Bus\Queueable;use Illuminate\Queue\SerializesModels;use Illuminate\Queue\InteractsWithQueue;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Foundation\Bus\Dispatchable;use Illuminate\Support\Facades\Cache;use Illuminate\Support\Facades\Mail;class EmailJob implements ShouldQueue{    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;    /**     * @var array     */    protected $callback;    protected $user;    protected $mail_template_alias;    protected $titleParams;    protected $contentParams;    protected $isAuthMail;    protected $batch_id;    protected $tag;    protected $check_route;    /**     * mailJob constructor.     * @param $user \Eloquent|string :用户实例或者邮箱地址     * @param $mail_template_alias     * @param $titleParams     * @param $contentParams     * @param bool $isAuthMail     */    public function __construct($user, $mail_template_alias, $titleParams, $contentParams, $isAuthMail = false)    {        $this->queue="email";//指定队列        $this->user = $user;        $this->mail_template_alias = $mail_template_alias;        $this->isAuthMail = $isAuthMail;        $this->titleParams = $titleParams;        $this->contentParams = $contentParams;        $this->tag = 'none';        $this->check_route="email.check";    }    /**     * Execute the job.     *     * @param EmailTemplateRepository $emailTemplateRepository     * @param EmailQueueRepository $emailQueueRepository     * @param EmailBatchRepository $emailBatchRepository     * @return void     * @throws \Exception     */    public function handle(        EmailTemplateRepository $emailTemplateRepository,        EmailQueueRepository $emailQueueRepository,        EmailBatchRepository $emailBatchRepository    ) {        $template=$emailTemplateRepository->getTemplate($this->mail_template_alias, $this->titleParams, $this->contentParams);        $mailQueue=$emailQueueRepository->createRecord($template, is_string($this->user)?$this->user:$this->user->email, $this->batch_id);        if (!isset($template->role) || $template->role->status == 0) {            $emailQueueRepository->saveRecord($mailQueue->id, 3, "邮件规则不存在或者邮件规则没有开启");            $emailBatchRepository->updateBatch($this->batch_id, false);            return;        }        try {            if ($this->isAuthMail) {                $this->sendAuthEmail($template);            } else {                $this->sendEmail($template);            }            $emailQueueRepository->saveRecord($mailQueue->id, 1);            $emailBatchRepository->updateBatch($this->batch_id);        } catch (\Exception $e) {            $emailQueueRepository->saveRecord($mailQueue->id, 3, $e->getMessage());            $emailBatchRepository->updateBatch($this->batch_id, false);            //throw $e;        }        if (!empty($this->callback)) {            $obj=app($this->callback[0][0]);            call_user_func_array([$obj, $this->callback[0][1]], $this->callback[1]);        }    }    /**     * @param $callback     */    public function setCallback($callback): void    {        $this->callback = $callback;    }    /**     * @param mixed $batch_id     */    public function setBatchId($batch_id): void    {        $this->batch_id = $batch_id;    }    /**     * @param mixed $tag     */    public function setTag($tag): void    {        $this->tag = $tag;    }    /**     * @param string $check_route     */    public function setCheckRoute(string $check_route): void    {        $this->check_route = $check_route;    }    /**     * @param $template     */    protected function sendEmail($template)    {        Mail::to($this->user)->send(new DefaultMail($template->value, $template->title, $this->user));    }    protected function sendAuthEmail($template)    {        $code=str_random(64);        $params['check_url']=route($this->check_route, ['code'=>$code,'tag'=>$this->tag]);        $template->value=render_template($template->value, $params);        $this->sendEmail($template);        $cache['alias']=$template->alias;        $cache['email']=is_string($this->user)?$this->user:$this->user->email;        Cache::put($code, $cache, 24*60);    }}
 |