SMTPGraphRelay V1

Ein kleiner nativer Windows-/PowerShell-Relay:

Drucker / NAS / Server / Monitoring
            |
            | SMTP (lokal)
            v
      SMTPGraphRelay
            |
            | HTTPS / OAuth2 / Microsoft Graph
            v
       Microsoft 365

Was V1 kann

  • SMTP-Listener auf konfigurierbarer IP / Port
  • EHLO, HELO, MAIL FROM, mehrere RCPT TO, DATA, RSET, NOOP, QUIT
  • IPv4-Allowlist per CIDR
  • maximale Mailgröße
  • lokale Store-and-Forward Queue
  • Retry bei Graph-/Netzwerkfehlern
  • Failed-Queue nach Max-Retries
  • Microsoft Graph sendMail
  • MIME-Mail wird als MIME an Graph weitergegeben
  • App-only OAuth mit Zertifikat
  • First-Run erzeugt:
    • selbstsigniertes Zertifikat in LocalMachine\My
    • Entra ID App Registration
    • Service Principal
    • Microsoft Graph Mail.Send Application Permission
    • Admin Consent
    • config.json
    • Windows-Firewallregel
    • Scheduled Task als SYSTEM

Voraussetzungen

  • Windows 10/11 oder Windows Server
  • Windows PowerShell 5.1
  • PowerShell als Administrator
  • Internetzugang zu Microsoft Graph / Entra
  • M365-/Entra-Admin, der App-Registrierungen und App Permissions vergeben darf
  • bestehendes Exchange-Online-Postfach für den konfigurierten Absender

Installation

  1. ZIP entpacken, z. B.:
C:\Program Files\SMTPGraphRelay
  1. Windows PowerShell als Administrator öffnen.

  2. Setup starten:

Set-ExecutionPolicy -Scope Process Bypass
cd "C:\Program Files\SMTPGraphRelay"
.\Setup-SMTPGraphRelay.ps1

Das Setup fragt u. a.:

  • App-Name
  • M365-Absenderpostfach
  • Listen-IP
  • SMTP-Port
  • erlaubte Quellnetze

Danach wird die Entra-App automatisch erstellt.

Standard

Port:

2525/TCP

Default-Allowlist:

127.0.0.1/32
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16

Der Absender wird standardmäßig immer auf das konfigurierte M365-Postfach umgeschrieben:

"ForceSender": true

Das verhindert, dass ein internes Gerät beliebige From:-Adressen durchreichen kann.

Start / Stop

Start:

Start-ScheduledTask -TaskName "SMTPGraphRelay"

Stop:

Stop-ScheduledTask -TaskName "SMTPGraphRelay"

Status:

Get-ScheduledTask -TaskName "SMTPGraphRelay" | Get-ScheduledTaskInfo

Test vom Relay-PC

Wenn Send-MailMessage noch vorhanden ist:

Send-MailMessage `
  -SmtpServer 127.0.0.1 `
  -Port 2525 `
  -From "test@local.invalid" `
  -To "dein.name@example.com" `
  -Subject "SMTPGraphRelay Test" `
  -Body "Hallo aus SMTPGraphRelay"

Alternativ kann jedes SMTP-Testtool verwendet werden.

Verzeichnisse

SMTPGraphRelay\
├── SMTPGraphRelay.ps1
├── Setup-SMTPGraphRelay.ps1
├── config.json
├── config.example.json
├── queue\
├── failed\
└── logs\
    └── SMTPGraphRelay.log

Queue

Nach vollständigem SMTP-DATA wird die Nachricht zunächst lokal gespeichert.

Erst danach bekommt der SMTP-Client:

250 2.0.0 Queued

Der Queue-Worker sendet die Nachricht anschließend über Microsoft Graph.

Standard-Retry:

1 min
5 min
15 min
30 min
60 min
120 min
240 min
480 min

Nach acht Fehlern wandert die Mail nach failed.

Sicherheit

Kein offenes Relay

Die SMTP-Seite besitzt eine IP-Allowlist. Bitte die Standard-RFC1918-Netze auf die tatsächlich benötigten Subnetze reduzieren.

Beispiel:

"AllowedNetworks": [
  "10.60.10.0/24",
  "10.20.30.15"
]

Kein Client Secret

Das Setup erzeugt ein nicht exportierbares RSA-Zertifikat in:

Cert:\LocalMachine\My

Der Scheduled Task läuft als SYSTEM und lädt dieses Zertifikat direkt aus dem Maschinen-Zertifikatsspeicher.

Graph-Berechtigung

Die V1 vergibt ausschließlich:

Microsoft Graph
Application
Mail.Send

Keine Mail.ReadWrite, Directory.Read.All, SMTP-/IMAP- oder Exchange-Full-Access-Permission ist für den Relaybetrieb nötig.

Wichtig: Mail.Send als Application Permission ist grundsätzlich eine weitreichende Berechtigung. Die V1 erzwingt zwar lokal das konfigurierte Senderpostfach, beschränkt die Entra-/Exchange-Berechtigung aber noch nicht serverseitig auf genau dieses Postfach.

Für eine nächste Version sollte zusätzlich Exchange Online Application RBAC bzw. die jeweils aktuelle Microsoft-Methode zur Ressourcenscope-Begrenzung integriert werden.

Bekannte Grenzen von V1

  • SMTP-Verbindungen werden seriell verarbeitet
  • kein SMTP AUTH
  • kein STARTTLS auf der internen SMTP-Seite
  • IPv4-Allowlist; IPv6 wird nicht freigegeben
  • kein Web-/GUI-Frontend
  • keine DSN/Bounce-Erzeugung
  • Envelope-Empfänger werden protokolliert; Graph erhält primär die Empfänger aus den MIME-Headern
  • kein serverseitiges Exchange-Mailbox-Scoping im Setup

Für typische Drucker, Scanner, NAS, Monitoring- und Server-Alerts sollte diese V1 als Test-/Pilotversion ausreichen.

Deinstallation

Task stoppen/löschen:

Stop-ScheduledTask -TaskName "SMTPGraphRelay" -ErrorAction SilentlyContinue
Unregister-ScheduledTask -TaskName "SMTPGraphRelay" -Confirm:$false

Firewallregel entfernen (Port ggf. anpassen):

Remove-NetFirewallRule -DisplayName "SMTPGraphRelay TCP 2525"

Die Entra-App und das Zertifikat werden absichtlich nicht automatisch gelöscht, damit bei einer Deinstallation keine Cloud-Credentials versehentlich entfernt werden.

S
Description
No description provided
Readme
370 KiB
Languages
PowerShell 100%