From 537026636d29fc36f1a6cb9525e0c157b351f2bc Mon Sep 17 00:00:00 2001 From: chengxl Date: Mon, 5 Jan 2026 10:57:13 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A8=BF=E4=BB=B6=E6=8F=90=E4=BA=A4=E7=BB=99?= =?UTF-8?q?=E4=BD=9C=E8=80=85=E5=8F=91=E9=80=81=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/api/job/SendAuthorEmail.php | 89 +++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 application/api/job/SendAuthorEmail.php diff --git a/application/api/job/SendAuthorEmail.php b/application/api/job/SendAuthorEmail.php new file mode 100644 index 00000000..a1d7c0c3 --- /dev/null +++ b/application/api/job/SendAuthorEmail.php @@ -0,0 +1,89 @@ +oQueueJob = new QueueJob; + $this->QueueRedis = QueueRedis::getInstance(); + } + + public function fire(Job $job, $data) + { + //任务开始判断 + $this->oQueueJob->init($job); + + // 获取 Redis 任务的原始数据 + $rawBody = empty($job->getRawBody()) ? '' : $job->getRawBody(); + $jobData = empty($rawBody) ? [] : json_decode($rawBody, true); + $jobId = empty($jobData['id']) ? 'unknown' : $jobData['id']; + + $this->oQueueJob->log("-----------队列任务开始-----------"); + $this->oQueueJob->log("当前任务ID: {$jobId}, 尝试次数: {$job->attempts()}"); + + try { + + // 验证任务数据完整性 + // 获取文章ID + $iArticleId = empty($data['article_id']) ? 0 : $data['article_id']; + //作者邮箱 + $email = empty($data['email']) ? '' : $data['email']; + //邮件主题 + $subject = empty($data['subject']) ? '' : $data['subject']; + //发送来源 + $title = empty($data['title']) ? '' : $data['title']; + $subject = empty($subject) ? $title : $subject; + //邮件内容 + $content = empty($data['content']) ? '' : $data['content']; + //邮箱 + $temail = empty($data['temail']) ? '' : $data['temail']; + //密码 + $tpassword = empty($data['tpassword']) ? '' : $data['tpassword']; + //邮件类型 + $type = empty($data['type']) ? 1 : $data['type']; + if (empty($iArticleId) || empty($email)) { + $this->oQueueJob->log("无效的article_id/email,删除任务"); + $job->delete(); + return; + } + + // 生成唯一任务标识 + $sClassName = get_class($this); + $sRedisKey = "queue_job:{$sClassName}:{$iArticleId}:{$email}"; + $sRedisValue = uniqid() . '_' . getmypid(); + if (!$this->oQueueJob->acquireLock($sRedisKey, $sRedisValue, $job)) { + return; // 未获取到锁,已处理 + } + + // 执行核心任务-发送邮件 + $aResult = sendEmail($email,$subject,$title,$content,$temail,$tpassword); + $iStatus = empty($aResult['status']) ? 1 : $aResult['status']; + $iIsSuccess = 2; + $sMsg = empty($aResult['data']) ? '失败' : $aResult['data']; + if($iStatus == 1){ + $iIsSuccess = 1; + $sMsg = '成功'; + } + // 更新完成标识 + $this->QueueRedis->finishJob($sRedisKey, 'completed', $this->completedExprie, $sRedisValue); + $job->delete(); + $this->oQueueJob->log("任务执行成功 | 日志ID: {$sRedisKey} | 执行日志:{$sMsg}"); + + } catch (RuntimeException $e) { + $this->oQueueJob->handleRetryableException($e,$sRedisKey,$sRedisValue, $job); + } catch (LogicException $e) { + $this->oQueueJob->handleNonRetryableException($e,$sRedisKey,$sRedisValue, $job); + } catch (Exception $e) { + $this->oQueueJob->handleRetryableException($e,$sRedisKey,$sRedisValue, $job); + } finally { + $this->oQueueJob->finnal(); + } + } +} \ No newline at end of file