fix: remove dependency on job_batches table for batch email sending

This commit is contained in:
xboard
2025-09-02 23:54:21 +08:00
parent 181075ad19
commit fe94d7ebc6
5 changed files with 65 additions and 31 deletions
@@ -16,7 +16,7 @@ use App\Utils\Helper;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Bus;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -453,27 +453,16 @@ class UserController extends Controller
]; ];
$chunkSize = 1000; $chunkSize = 1000;
$totalProcessed = 0;
$builder->chunk($chunkSize, function ($users) use ($subject, $templateValue, &$totalProcessed) { $builder->chunk($chunkSize, function ($users) use ($subject, $templateValue, &$totalProcessed) {
$jobs = [];
foreach ($users as $user) { foreach ($users as $user) {
$jobs[] = new SendEmailJob([ dispatch(new SendEmailJob([
'email' => $user->email, 'email' => $user->email,
'subject' => $subject, 'subject' => $subject,
'template_name' => 'notify', 'template_name' => 'notify',
'template_value' => $templateValue 'template_value' => $templateValue
], 'send_email_mass'); ], 'send_email_mass'));
} }
if (!empty($jobs)) {
Bus::batch($jobs)
->allowFailures()
->dispatch();
}
$totalProcessed += $users->count();
}); });
return $this->success(true); return $this->success(true);
+2 -3
View File
@@ -3,7 +3,6 @@
namespace App\Jobs; namespace App\Jobs;
use App\Services\MailService; use App\Services\MailService;
use Illuminate\Bus\Batchable;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Bus\Dispatchable;
@@ -12,7 +11,7 @@ use Illuminate\Queue\SerializesModels;
class SendEmailJob implements ShouldQueue class SendEmailJob implements ShouldQueue
{ {
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, Batchable; use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $params; protected $params;
public $tries = 3; public $tries = 3;
@@ -36,7 +35,7 @@ class SendEmailJob implements ShouldQueue
public function handle() public function handle()
{ {
$mailLog = MailService::sendEmail($this->params); $mailLog = MailService::sendEmail($this->params);
if($mailLog['error']){ if ($mailLog['error']) {
$this->release(); //发送失败将触发重试 $this->release(); //发送失败将触发重试
} }
} }
File diff suppressed because one or more lines are too long
+28 -5
View File
@@ -2632,13 +2632,36 @@ window.XBOARD_TRANSLATIONS['en-US'] = {
} }
}, },
"actions": { "actions": {
"unbind": "Unbind", "title": "Actions",
"unbindTelegramTitle": "Confirm Unbind Telegram", "send_email": "Send Email",
"unbindTelegramDescription": "This action will unbind the user's Telegram account. The user will need to rebind to receive notifications. Are you sure you want to continue?" "export_csv": "Export CSV",
"traffic_reset_stats": "Traffic Reset Stats",
"batch_ban": "Batch Ban",
"confirm_ban": {
"title": "Confirm Batch Ban",
"filtered_description": "This action will ban all users that match your current filters. This action cannot be undone.",
"all_description": "This action will ban all users in the system. This action cannot be undone.",
"cancel": "Cancel",
"confirm": "Confirm Ban",
"banning": "Banning..."
}
}, },
"messages": { "messages": {
"telegramUnbound": "Telegram unbound successfully", "success": "Success",
"telegramUnbindFailed": "Failed to unbind Telegram" "error": "Error",
"export": {
"success": "Export successful",
"failed": "Export failed"
},
"batch_ban": {
"success": "Batch ban successful",
"failed": "Batch ban failed"
},
"send_mail": {
"success": "Email sent successfully",
"failed": "Failed to send email",
"required_fields": "Please fill in all required fields"
}
}, },
"traffic_reset": { "traffic_reset": {
"title": "Traffic Reset", "title": "Traffic Reset",
+28 -5
View File
@@ -2598,9 +2598,19 @@ window.XBOARD_TRANSLATIONS['zh-CN'] = {
} }
}, },
"actions": { "actions": {
"unbind": "解绑", "title": "操作",
"unbindTelegramTitle": "确认解绑Telegram", "send_email": "发送邮件",
"unbindTelegramDescription": "此操作将解绑用户的Telegram账号,用户需要重新绑定才能接收通知。确定要继续吗?" "export_csv": "导出 CSV",
"traffic_reset_stats": "流量重置统计",
"batch_ban": "批量封禁",
"confirm_ban": {
"title": "确认批量封禁",
"filtered_description": "此操作将封禁所有符合当前筛选条件的用户。此操作无法撤销。",
"all_description": "此操作将封禁系统中的所有用户。此操作无法撤销。",
"cancel": "取消",
"confirm": "确认封禁",
"banning": "封禁中..."
}
}, },
"traffic_reset": { "traffic_reset": {
"title": "流量重置", "title": "流量重置",
@@ -2714,8 +2724,21 @@ window.XBOARD_TRANSLATIONS['zh-CN'] = {
} }
}, },
"messages": { "messages": {
"telegramUnbound": "Telegram解绑成功", "success": "成功",
"telegramUnbindFailed": "Telegram解绑失败" "error": "错误",
"export": {
"success": "导出成功",
"failed": "导出失败"
},
"batch_ban": {
"success": "批量封禁成功",
"failed": "批量封禁失败"
},
"send_mail": {
"success": "邮件发送成功",
"failed": "邮件发送失败",
"required_fields": "请填写所有必填字段"
}
}, },
"send_mail": { "send_mail": {
"title": "发送邮件", "title": "发送邮件",