5.3 KiB
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, mehrereRCPT 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.SendApplication Permission - Admin Consent
config.json- Windows-Firewallregel
- Scheduled Task als
SYSTEM
- selbstsigniertes Zertifikat in
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
- ZIP entpacken, z. B.:
C:\Program Files\SMTPGraphRelay
-
Windows PowerShell als Administrator öffnen.
-
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.