32 lines
1.0 KiB
PHP
32 lines
1.0 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Ui\Mail;
|
|
|
|
use Livewire\Component;
|
|
|
|
class BounceCard extends Component
|
|
{
|
|
public int $bounces24h = 0;
|
|
public array $topCodes = []; // [['code'=>'550', 'count'=>12], ...]
|
|
|
|
public function mount(): void { $this->load(); }
|
|
public function render() { return view('livewire.ui.mail.bounce-card'); }
|
|
public function refresh(): void { $this->load(true); }
|
|
|
|
protected function load(bool $force=false): void
|
|
{
|
|
// Parse last 2000 lines of mail log for status=bounced / defer / reject
|
|
$log = @shell_exec('tail -n 2000 /var/log/mail.log 2>/dev/null') ?? '';
|
|
$this->bounces24h = preg_match_all('/status=bounced/i', $log);
|
|
|
|
$counts = [];
|
|
if ($log) {
|
|
if (preg_match_all('/\s([45]\d\d)\s/m', $log, $m)) {
|
|
foreach ($m[1] as $c) $counts[$c] = ($counts[$c] ?? 0) + 1;
|
|
}
|
|
}
|
|
arsort($counts);
|
|
$this->topCodes = collect($counts)->take(5)->map(fn($v,$k)=>['code'=>$k,'count'=>$v])->values()->all();
|
|
}
|
|
}
|