50 lines
1.8 KiB
PHP
50 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace App\Providers;
|
|
|
|
use App\Jobs\PacedMail;
|
|
use App\Services\Mail\MailLane;
|
|
use App\Support\Settings;
|
|
use Illuminate\Cache\RateLimiting\Limit;
|
|
use Illuminate\Mail\SendQueuedMailable;
|
|
use Illuminate\Support\Facades\RateLimiter;
|
|
use Illuminate\Support\ServiceProvider;
|
|
|
|
/**
|
|
* Der Takt der beiden gedrosselten Spuren.
|
|
*
|
|
* Die Bindung ist die ganze Verkabelung: `Mailable::newQueuedJob()` erzeugt den
|
|
* Auftrag über den Container, also fährt ab hier jede Mail über PacedMail —
|
|
* ohne dass eine Absendestelle davon weiß.
|
|
*
|
|
* `Limit::perMinutes($minuten, $anzahl)` — Minuten zuerst. Die Reihenfolge ist
|
|
* anders herum, als man sie liest, und ein vertauschtes Paar wäre ein Takt von
|
|
* fünf Mails in dreißig Minuten statt dreißig in fünf.
|
|
*
|
|
* Die direkte Spur bekommt gar keine Drossel angemeldet, nicht bloß ein hohes
|
|
* Kontingent: dort wartet gerade ein Mensch, der eben geklickt hat.
|
|
*/
|
|
class MailPaceServiceProvider extends ServiceProvider
|
|
{
|
|
public function register(): void
|
|
{
|
|
$this->app->bind(SendQueuedMailable::class, PacedMail::class);
|
|
}
|
|
|
|
public function boot(): void
|
|
{
|
|
// Die Einstellungen werden im Rückruf gelesen, nicht hier: der Rückruf
|
|
// läuft im Arbeiter je Auftrag, und eine Änderung des Betreibers wirkt
|
|
// damit ab dem nächsten Auftrag statt erst ab dem nächsten Neustart.
|
|
RateLimiter::for(MailLane::URGENT, fn () => Limit::perMinutes(
|
|
(int) Settings::get('mail.pace.urgent.minutes', 5),
|
|
(int) Settings::get('mail.pace.urgent.count', 30),
|
|
));
|
|
|
|
RateLimiter::for(MailLane::CALM, fn () => Limit::perMinutes(
|
|
(int) Settings::get('mail.pace.calm.minutes', 10),
|
|
(int) Settings::get('mail.pace.calm.count', 20),
|
|
));
|
|
}
|
|
}
|