53 lines
1.6 KiB
PHP
53 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Models\MailUser;
|
|
use Illuminate\Console\Command;
|
|
|
|
class UpdateMailboxStats extends Command
|
|
{
|
|
protected $signature = 'mail:update-stats {--user=}';
|
|
protected $description = 'Aktualisiert Mailquota und Nachrichtenzahl für alle Mailboxen (oder einen spezifischen Benutzer)';
|
|
|
|
public function handle(): int
|
|
{
|
|
$query = MailUser::query()->where('is_active', true);
|
|
|
|
if ($email = $this->option('user')) {
|
|
$query->where('email', $email);
|
|
}
|
|
|
|
$users = $query->get();
|
|
|
|
foreach ($users as $u) {
|
|
$email = $u->email;
|
|
$domain = explode('@', $email)[1];
|
|
$local = explode('@', $email)[0];
|
|
$path = "/var/mail/vhosts/{$domain}/{$local}";
|
|
|
|
$usedBytes = 0;
|
|
$messageCount = 0;
|
|
|
|
if (is_dir($path)) {
|
|
$usedBytes = (int) trim(shell_exec('du -sb '.escapeshellarg($path).' 2>/dev/null | cut -f1'));
|
|
}
|
|
|
|
$out = trim(shell_exec('doveadm mailbox status -u '.escapeshellarg($email).' messages INBOX 2>/dev/null'));
|
|
if (preg_match('/messages=(\d+)/', $out, $m)) {
|
|
$messageCount = (int) $m[1];
|
|
}
|
|
|
|
$u->update([
|
|
'used_bytes' => $usedBytes,
|
|
'message_count' => $messageCount,
|
|
'stats_refreshed_at' => now(),
|
|
]);
|
|
|
|
$this->info(sprintf("%-35s %6.1f MiB %4d Nachrichten", $email, $usedBytes / 1024 / 1024, $messageCount));
|
|
}
|
|
|
|
return Command::SUCCESS;
|
|
}
|
|
}
|