Files
SMTPGraphRelay/README.md
T

3.4 KiB
Raw Blame History

SMTPGraphRelay V1.3 parallele SMTP-Verbindungen

V1.3 baut auf V1.2 auf. Entra-App, Zertifikat, Exchange Application RBAC und config.json können unverändert weiterverwendet werden.

Neu

  • bis zu 20 parallele SMTP-Verbindungen standardmäßig
  • konfigurierbares Parallel-Limit über Smtp.MaxConcurrentClients
  • SMTP-Clients laufen in einem .NET Runspace Pool
  • Queue-/Graph-Versand läuft in einem eigenen Runspace
  • ein langsamer Graph-Aufruf blockiert die SMTP-Annahme nicht mehr
  • ein langsamer/hängender SMTP-Client blockiert andere Clients nicht mehr
  • bei erreichtem Parallel-Limit erhält ein neuer Client: 421 4.3.2 SMTPGraphRelay busy, try again later
  • Logging ist mit einem benannten Mutex gegen parallele Schreibzugriffe geschützt
  • Queue-/Retry-Logik aus V1.2 bleibt erhalten

Optional: Parallel-Limit konfigurieren

Bestehende config.json muss nicht geändert werden. Ohne Eintrag gilt 20.

Optional:

"Smtp": {
  "ListenAddress": "0.0.0.0",
  "Port": 2525,
  "Hostname": "SMTPRELAY01",
  "AllowedNetworks": [
    "127.0.0.1/32",
    "10.0.0.0/8",
    "172.16.0.0/12",
    "192.168.0.0/16"
  ],
  "MaxMessageSizeMB": 25,
  "ClientTimeoutSeconds": 120,
  "MaxConcurrentClients": 20
}

Erlaubter Bereich: 1 bis 200. Ungültige Werte fallen auf 20 zurück.

Update

Stop-ScheduledTask -TaskName "SMTPGraphRelay"

Copy-Item `
  "C:\Program Files\SMTPGraphRelay\SMTPGraphRelay.ps1" `
  "C:\Program Files\SMTPGraphRelay\SMTPGraphRelay-V1.2-backup.ps1"

Dann SMTPGraphRelay-V1.3.ps1 als

C:\Program Files\SMTPGraphRelay\SMTPGraphRelay.ps1

ablegen und starten:

Start-ScheduledTask -TaskName "SMTPGraphRelay"

Log:

Get-Content `
  "C:\Program Files\SMTPGraphRelay\logs\SMTPGraphRelay.log" `
  -Tail 100

Beim Start sollten u. a. erscheinen:

SMTPGraphRelay V1.3 gestartet ...
Maximale parallele SMTP-Verbindungen: 20
Queue-/Graph-Worker läuft separat vom SMTP-Listener.

Test für Parallelität

In mehreren PowerShell-Fenstern gleichzeitig:

Send-MailMessage `
  -SmtpServer 127.0.0.1 `
  -Port 2525 `
  -From "info@maieredv.de" `
  -To "manuel.maier@maieredv.de" `
  -Subject "Parallel-Test" `
  -Body "SMTPGraphRelay V1.3"

Für einen härteren Test können mehrere Jobs gleichzeitig gestartet werden:

1..10 | ForEach-Object {
    Start-Job -ArgumentList $_ -ScriptBlock {
        param($n)
        Send-MailMessage `
            -SmtpServer 127.0.0.1 `
            -Port 2525 `
            -From "info@maieredv.de" `
            -To "manuel.maier@maieredv.de" `
            -Subject "Parallel-Test $n" `
            -Body "Nachricht $n"
    }
}

Get-Job | Wait-Job | Receive-Job
Get-Job | Remove-Job

Architektur

                         +--> SMTP Worker 1 --+
SMTP Listener -----------+--> SMTP Worker 2 --+--> pending\
                         +--> SMTP Worker N --+
                                Runspace Pool
                                     |
                                     | unabhängig
                                     v
                             Queue / Graph Worker
                                     |
                                     v
                              Microsoft Graph

Der SMTP-Listener nimmt dadurch weiter neue Verbindungen an, während andere Clients noch DATA übertragen oder Microsoft Graph gerade langsam antwortet.