resetPage(); } public function updatedView(): void { $this->resetPage(); } public function release(int $id): void { $this->authorize('users:manage'); $suppression = EmailSuppression::query()->findOrFail($id); app(EmailSuppressionService::class)->release($suppression, auth()->user(), 'Freigabe im Admin'); session()->flash('status', __(':email freigegeben — der nächste Rückläufer sperrt sie wieder.', ['email' => $suppression->email])); } public function suppress(): void { $this->authorize('users:manage'); $validated = $this->validate([ 'newEmail' => ['required', 'email', 'max:190'], 'newNote' => ['nullable', 'string', 'max:500'], ]); app(EmailSuppressionService::class)->suppress($validated['newEmail'], EmailSuppressionReason::Manual, 'admin', $validated['newNote'] ?: 'manuell im Admin'); $this->reset('newEmail', 'newNote'); session()->flash('status', __('Adresse gesperrt.')); } public function with(): array { $query = EmailSuppression::query() ->when($this->view === 'active', fn ($q) => $q->active()) ->when($this->view === 'released', fn ($q) => $q->whereNotNull('released_at')) ->when(trim($this->search) !== '', fn ($q) => $q->whereLike('email', '%'.trim($this->search).'%')) ->orderByDesc('suppressed_at') ->orderByDesc('id'); return [ 'suppressions' => $query->paginate(50), 'activeCount' => EmailSuppression::query()->active()->count(), 'bouncesThisWeek' => EmailBounce::query()->where('received_at', '>=', now()->subDays(7))->count(), 'unparsed' => ActivityEvent::query() ->where('type', ActivityType::MailSuppressed->value) ->where('description', 'like', 'Rückläufer nicht lesbar%') ->latest('occurred_at') ->limit(10) ->get(), 'circuitOpenUntil' => app(MailCircuitBreaker::class)->openUntil(), 'returnPath' => (string) config('bounces.return_path'), 'imapConfigured' => filled(config('imap.accounts.bounces.host')), ]; } }; ?>
@if ($circuitOpenUntil) {{ __('Versand angehalten bis :time', ['time' => $circuitOpenUntil->format('H:i')]) }} @else {{ __('Versand läuft') }} @endif @if ($imapConfigured) {{ __('Postfach angebunden') }} @else {{ __('Kein Bounce-Postfach konfiguriert') }} @endif @if (session('status'))
{{ session('status') }}
@endif
{{ __('Adressen ohne Zustellung') }} {{ __('alle Quellen') }} {{ $returnPath ? __('Rückläufer landen im Bounce-Postfach') : __('MAIL_RETURN_PATH nicht gesetzt') }}
@if ($unparsed->isNotEmpty())
{{ __('Nicht lesbare Rückläufer') }} {{ __('liegen im Postfach unter „Unparsed“') }}
@endif @can('users:manage')
{{ __('Adresse sperren') }}
{{ __('Sperren') }}
@endcan
{{ __('Adressen') }} {{ __(':count Einträge', ['count' => $suppressions->total()]) }}
{{ __('Adresse') }} {{ __('Grund') }} {{ __('Rückläufer') }} {{ __('Zuletzt') }} {{ __('Status') }} {{ __('Aktion') }} @forelse ($suppressions as $suppression) {{ $suppression->email }} @if ($suppression->note) {{ $suppression->note }} @endif {{ $suppression->reason->label() }} {{ $suppression->source }} {{ $suppression->hard_bounce_count }} {{ __('hart') }} · {{ $suppression->soft_bounce_count }} {{ __('weich') }} {{ ($suppression->last_bounced_at ?? $suppression->suppressed_at)?->format('d.m.Y H:i') ?? '—' }} @if ($suppression->isActive()) {{ __('gesperrt') }} @else {{ __('freigegeben') }} @endif @can('users:manage') @if ($suppression->isActive()) {{ __('Freigeben') }} @endif @endcan @empty
{{ __('Keine Adressen in dieser Ansicht.') }}
@endforelse
@if ($suppressions->hasPages())
{{ $suppressions->links() }}
@endif