SMTP Auth 365 Connector – SMTP/POP3-Proxy für Microsoft Graph
SMTP Auth 365 Connector – SMTP-/POP3-Anbindung für Microsoft 365
Zweck
SMTP Auth 365 Connector ermöglicht einer älteren Anwendung den Mailversand über Microsoft 365 und den Abruf des Posteingangs über POP3, obwohl die Anwendung selbst kein OAuth2 unterstützt.
Alte Anwendung
│ SMTP AUTH LOGIN/PLAIN
▼
SMTP Auth 365 Connector Windows-Dienst
│ persistente lokale Warteschlange
▼
Microsoft Graph mit App-only-OAuth2
│ klein: /users/{Postfach}/sendMail
│ groß: Entwurf + Anhänge + /send
▼
Exchange Online
Für den Abruf gilt die umgekehrte Richtung:
Alter POP3-Client
│ USER = vollständige Postfachadresse
│ PASS = gemeinsames lokales Kennwort
▼
SMTP Auth 365 Connector Windows-Dienst
│ Microsoft Graph: Inbox auflisten und MIME über /$value abrufen
▼
Exchange Online
Es wird keine SMTP-Verbindung zu Exchange Online aufgebaut. Der Ausgang erfolgt ausschließlich über HTTPS und Microsoft Graph.
Systemvoraussetzungen
- Windows Server beziehungsweise RDS-Server
- .NET Framework 4.8
- Visual Studio 2022 zum Kompilieren
- Microsoft-365-Mandant mit Exchange Online
- Berechtigung zum Erstellen einer Entra-App
- Ausgehender HTTPS-Zugriff auf Port 443
- Zugriff auf
login.microsoftonline.com,graph.microsoft.comund für große Anhänge auf die von Graph gelieferte Upload-URL unteroutlook.office.com
Funktionsweise der Warteschlange
Nachrichten werden zuerst dauerhaft gespeichert:
<Programmordner>\Queue
├── Incoming
├── Pending
└── DeadLetter
Erst danach erhält die alte Anwendung 250 Queued. Ist Graph kurzzeitig nicht
erreichbar oder antwortet mit 429 Too Many Requests, erfolgt ein späterer
Versuch. Ein von Graph gesendeter Retry-After-Wert wird berücksichtigt.
Nach dauerhaften Graph-Fehlern oder zu vielen Versuchen wird die Nachricht nach
DeadLetter verschoben. Dieser Ordner muss überwacht werden.
1. Anwendung in Microsoft Entra anlegen
- Microsoft Entra Admin Center öffnen.
- App-Registrierungen öffnen.
- Eine mandanteninterne Anwendung
SMTP Auth 365 Connectorerstellen. - Anwendungs-ID (Client-ID) notieren.
- Verzeichnis-ID (Tenant-ID) notieren.
- Unter Zertifikate und Geheimnisse ein Client Secret erstellen.
- Den Secret-Wert sicher notieren.
Das Client Secret wird später DPAPI-verschlüsselt gespeichert und niemals in
App.config eingetragen.
2. Globale Graph-Berechtigung vergeben
In der Entra-App:
- API-Berechtigungen öffnen.
- Berechtigung hinzufügen wählen.
- Microsoft Graph auswählen.
- Anwendungsberechtigungen auswählen.
Mail.Sendhinzufügen.Mail.ReadWritehinzufügen.- Die Administratorzustimmung für den Mandanten erteilen.
Mail.Send erlaubt den Versand ohne angemeldeten Benutzer. Mail.ReadWrite ist
für den Großnachrichtenweg und den POP3-Abruf erforderlich: Der Dienst legt
Entwürfe an, liest MIME-Nachrichten, setzt auf Wunsch den Gelesen-Status und
führt bestätigte POP3-Löschungen aus. Beide globalen
Anwendungsberechtigungen gelten standardmäßig für alle Postfächer. Der Dienst
verwendet jedoch nur Absender aus AllowedSenderAddresses beziehungsweise der
optionalen Domänenfreigabe und POP3-Postfächer aus AllowedPop3Mailboxes oder
AllowedPop3MailboxDomains.
Der Graph-Aufruf erfolgt immer exakt über dieses Postfach:
From: test@kunde.de
→ POST /users/test@kunde.de/sendMail
Die aus From: gelesene Adresse wird als Graph-Zielpostfach verwendet und erneut
als MIME-Absender eingesetzt. Microsoft Graph speichert die versendete Nachricht
automatisch im Ordner Gesendete Elemente dieses Postfachs.
Microsoft: Graph-Berechtigungen – Mail.Send und Mail.ReadWrite
3. Empfohlene Einschränkung auf ein Postfach
Die globale Entra-Berechtigung ist einfach einzurichten, besitzt aber einen sehr großen Berechtigungsumfang. Für eine zukunftsorientierte Least-Privilege- Konfiguration empfiehlt Microsoft Role Based Access Control for Applications in Exchange Online. Dieses Verfahren ersetzt die älteren Application Access Policies.
Microsoft: RBAC for Applications in Exchange Online
Wichtig: Berechtigungen aus Entra und Exchange-RBAC wirken additiv. Wenn du eine
echte Postfachbeschränkung über Application RBAC verwendest, müssen die globalen
Mail.Send- und Mail.ReadWrite-Anwendungsberechtigungen in Entra anschließend
entfernt werden. Im Exchange-RBAC-Scope müssen dann beide Rollen vergeben sein.
Schematisches Beispiel:
Connect-MgGraph -Scopes "Application.Read.All"
Connect-ExchangeOnline
$clientId = "CLIENT-ID-DER-APP"
$mailbox = "smtp@firma.at"
$entraServicePrincipal = Get-MgServicePrincipal `
-Filter "appId eq '$clientId'"
New-ServicePrincipal `
-AppId $clientId `
-ObjectId $entraServicePrincipal.Id `
-DisplayName "SMTP Auth 365 Connector"
Set-Mailbox -Identity $mailbox -CustomAttribute15 "SMTPAuth365Connector"
New-ManagementScope `
-Name "SMTPAuth365Connector-Mailbox" `
-RecipientRestrictionFilter "CustomAttribute15 -eq 'SMTPAuth365Connector'"
New-ManagementRoleAssignment `
-Name "SMTPAuth365Connector-Mail.Send" `
-App $entraServicePrincipal.Id `
-Role "Application Mail.Send" `
-CustomResourceScope "SMTPAuth365Connector-Mailbox"
New-ManagementRoleAssignment `
-Name "SMTPAuth365Connector-Mail.ReadWrite" `
-App $entraServicePrincipal.Id `
-Role "Application Mail.ReadWrite" `
-CustomResourceScope "SMTPAuth365Connector-Mailbox"
Test-ServicePrincipalAuthorization `
-Identity $entraServicePrincipal.Id `
-Resource $mailbox
Prüfe vorher, ob CustomAttribute15 bereits anderweitig verwendet wird.
RBAC-Änderungen können wegen Zwischenspeicherung verzögert wirksam werden.
Bei mehreren erlaubten Absendepostfächern muss das gewählte Attribut bei jedem
dieser Postfächer gesetzt werden, damit alle im Management Scope enthalten sind.
4. Anwendung konfigurieren
In App.config mindestens anpassen:
<add key="TenantId" value="TENANT-ID" />
<add key="ClientId" value="CLIENT-ID" />
<add key="AllowedSenderAddresses"
value="test@kunde.de,rechnung@kunde.de,bestellung@kunde.de" />
<add key="AllowedSenderDomains" value="" />
<add key="OAuthScope" value="https://graph.microsoft.com/.default" />
<!-- Leer = Ordner der laufenden SMTPAuth365Connector.exe -->
<add key="DataPath" value="" />
Bei leerem DataPath liegen die Daten standardmäßig direkt im Programmordner:
<Programmordner>
├── Logs
├── Pop3State
├── Queue
└── Secrets
Ein explizit eingetragener abweichender Pfad bleibt weiterhin möglich. Bei der Dienstinstallation richtet das Programm die erforderlichen Rechte für das Dienstkonto ein. Schreibrechte erhält es gezielt nur auf den veränderlichen Daten-Unterordnern.
POP3 wird unabhängig vom SMTP-Port konfiguriert:
<add key="Pop3Enabled" value="true" />
<add key="Pop3ListenAddress" value="127.0.0.1" />
<add key="Pop3ListenPort" value="2110" />
<add key="AllowedPop3Mailboxes"
value="test@kunde.de,rechnung@kunde.de" />
<add key="AllowedPop3MailboxDomains" value="" />
<add key="Pop3RequireStartTls" value="false" />
<add key="Pop3MaxMessages" value="1000" />
<add key="Pop3MaxMessageBytes" value="52428800" />
<add key="Pop3MarkAsReadOnRetrieval" value="true" />
<add key="Pop3DeleteTransferredMessages" value="false" />
Der POP3-Benutzername ist immer die vollständige Mailadresse des gewünschten Postfachs. Das Kennwort ist dasselbe gemeinsame lokale Kennwort wie beim SMTP- Eingang. Es handelt sich nicht um das Microsoft-365-Kennwort.
Ein Postfach ist erlaubt, wenn seine vollständige Adresse in
AllowedPop3Mailboxes steht oder seine Domain in
AllowedPop3MailboxDomains enthalten ist. Mehrere Einträge werden durch Komma
getrennt. Domains werden ohne @ eingetragen und gelten nur exakt; die Freigabe
von kunde.de schließt beispielsweise tochter.kunde.de nicht automatisch ein.
Beispiel: Alle POP3-Postfächer von kunde.de erlauben:
<add key="AllowedPop3Mailboxes" value="" />
<add key="AllowedPop3MailboxDomains" value="kunde.de" />
Einzeladressen und Domains können auch gemeinsam verwendet werden:
<add key="AllowedPop3Mailboxes" value="sonderpostfach@firma.at" />
<add key="AllowedPop3MailboxDomains" value="kunde.de,kunde.com" />
Nach dem Kompilieren heißt die aktive Datei SMTPAuth365Connector.exe.config.
Betrieb auf demselben RDS-Server
<add key="ListenAddress" value="127.0.0.1" />
<add key="ListenPort" value="2525" />
<add key="AllowedClientAddresses" value="127.0.0.1,::1" />
<add key="RequireStartTls" value="false" />
Zugriff aus dem LAN
<add key="ListenAddress" value="0.0.0.0" />
<add key="AllowedClientAddresses" value="192.168.10.25" />
<add key="RequireStartTls" value="true" />
<add key="TlsCertificateThumbprint" value="ZERTIFIKAT-FINGERABDRUCK" />
Das Zertifikat muss mit privatem Schlüssel unter LocalMachine\My liegen. Das
Dienstkonto NETWORK SERVICE benötigt Leserechte auf den privaten Schlüssel.
Unterstützt wird STARTTLS, aber kein implizites SMTPS auf Port 465.
5. Absender und Empfänger
Microsoft Graph ermittelt Empfänger aus den MIME-Kopfzeilen, klassisches SMTP
dagegen aus RCPT TO. Der Proxy gleicht beide Verfahren an:
- Das Graph-Absendepostfach wird dynamisch aus dem MIME-Header
From:ermittelt. - Es muss genau eine gültige
From:-Adresse vorhanden sein. - Die Adresse muss in
AllowedSenderAddressesfreigegeben sein. - Für alle erlaubten Absender wird dasselbe lokale SMTP-Kennwort verwendet.
- Nur mit
RCPT TOangenommene Empfänger werden an Graph übergeben. - Passende ursprüngliche
To- undCc-Empfänger bleiben sichtbar. - Verdeckte Empfänger werden als
Bcceingesetzt. - Andere Empfängerangaben in MIME-Headern werden nicht ungeprüft übernommen.
- Der MIME-Absender wird auf die geprüfte dynamische
From:-Adresse gesetzt.
Beispiel:
From: rechnung@kunde.de
→ POST /users/rechnung@kunde.de/sendMail
→ Gesendete Elemente von rechnung@kunde.de
Ist AllowedSenderAddresses nicht leer, hat diese Liste Vorrang. Nur wenn sie
leer ist, wird AllowedSenderDomains als weniger strenger Fallback verwendet.
6. Größenlimit und große Anhänge
Die Standardgrenze für die komplette eingehende SMTP-/MIME-Nachricht beträgt 25 MiB:
<add key="MaxMessageBytes" value="26214400" />
Der Versandweg wird automatisch gewählt:
- Bis einschließlich 2.800.000 Byte: direkter Graph-MIME-Versand.
- Darüber: MIME-Zerlegung, Graph-Entwurf, einzelne Anhänge und anschließendes Senden des Entwurfs.
- Anhänge bis 2.800.000 Byte werden direkt am Entwurf angelegt.
- Größere Anhänge werden in Blöcken über eine Graph Upload Session übertragen.
Schlägt ein Anhang-Upload fehl, wird ein noch nicht gesendeter Entwurf nach Möglichkeit entfernt. Der normale Warteschlangenmechanismus startet beim nächsten Versuch einen neuen Entwurf und lädt die Anhänge erneut hoch.
MaxMessageBytes darf in dieser Version zwischen 1 KiB und 100 MiB liegen. Die
Einstellung ist die Größe der gesamten SMTP-Nachricht, nicht nur eines Anhangs.
Base64 und MIME-Header verursachen zusätzlichen Platzbedarf. Zusätzlich gelten
die Größenlimits von Exchange Online und dem jeweiligen Postfach. Microsoft
Graph unterstützt über Upload Sessions einzelne Anhänge bis 150 MB; das
Standardlimit des Dienstes ist bewusst niedriger.
Für den Großnachrichtenweg sind Mail.ReadWrite und Mail.Send als
Anwendungsberechtigungen erforderlich. Microsoft weist außerdem auf ein
bekanntes Problem bei großen Anhängen in freigegebenen oder delegierten
Postfächern hin. Dieser Fall sollte mit dem tatsächlich verwendeten Postfach
getestet werden.
Der Großnachrichtenweg übernimmt Betreff, HTML- oder Textinhalt, To, Cc, Bcc, Reply-To, normale Dateianhänge und eingebettete CID-Inhalte. Kryptografisch signierte oder verschlüsselte S/MIME-Nachrichten sollten unterhalb der direkten MIME-Grenze bleiben und müssen gesondert getestet werden.
Microsoft: Große Anhänge mit Upload Sessions
7. Kompilieren und installieren
Schneller Test mit Klartextparametern
Für Tests steht TestConfiguration.vb zur Verfügung. Dort zuerst aktivieren:
Public Const Enabled As Boolean = True
Anschließend können alle relevanten Werte direkt im Modul eingetragen werden:
Public Const SmtpUsername As String = "alte-anwendung"
Public Const SmtpPassword As String = "lokales-testkennwort"
Public Const AllowedSenderAddresses As String =
"test@kunde.de,rechnung@kunde.de"
Public Const Pop3Enabled As Boolean = True
Public Const Pop3ListenPort As Integer = 2110
Public Const AllowedPop3Mailboxes As String =
"test@kunde.de,rechnung@kunde.de"
Public Const AllowedPop3MailboxDomains As String = ""
Public Const Pop3DeleteTransferredMessages As Boolean = False
Public Const TenantId As String = "Tenant-ID"
Public Const ClientId As String = "Client-ID"
Public Const ClientSecret As String = "Client-Secret"
Public Const DebugLogging As Boolean = True
Bei aktiviertem Testmodus werden die entsprechenden Werte aus App.config und
die DPAPI-Dateien nicht verwendet. Der Datenpfad liegt standardmäßig im Ordner
der laufenden SMTPAuth365Connector.exe:
<Programmordner>
Das Programm kann in Visual Studio gestartet oder direkt im Konsolenmodus ausgeführt werden:
.\SMTPAuth365Connector.exe --console
Ein normaler Start öffnet grundsätzlich die Windows-Oberfläche. --console
bleibt aus Kompatibilitätsgründen gleichbedeutend mit einem normalen GUI-Start.
Nur --nogui startet den Connector als unsichtbaren lokalen Prozess. Der bei
der Dienstregistrierung eingetragene Parameter --service ist ausschließlich
für den Windows-Dienst bestimmt.
Der bisherige Text-Konsolenmodus wurde durch eine Windows-Oberfläche ersetzt. Das Produkticon wird als Programmsymbol, im Fenstertitel, in der Taskleiste und links im Kopfbereich der Oberfläche angezeigt. Sie besteht aus drei Bereichen:
- Übersicht: Zustand der lokalen Testinstanz und des installierten Dienstes, Endpunkte, Datenpfad und verwendete Konfigurationsdatei.
- Einstellungen: Allgemeine, POP3-, SMTP- und Microsoft-Graph-Parameter.
Ein neu eingegebenes SMTP/POP3-Kennwort beziehungsweise Client Secret wird mit
DPAPI für den lokalen Computer verschlüsselt. Ein leeres Geheimnisfeld behält
den vorhandenen Wert bei. Bereits gespeicherte Geheimnisse erscheinen als
********; dieser Platzhalter wird nicht als neues Kennwort gespeichert. - Live-Protokoll: Aktualisierung ungefähr alle 650 Millisekunden, farbliche Kennzeichnung von Fehlern, Warnungen und Debugmeldungen sowie Pause, automatisches Scrollen und Öffnen des Logordners.
Auf der Übersichtsseite stehen zusätzlich die Aktionen Dienst installieren, Dienst neu starten und Dienst deinstallieren bereit. Installation und Deinstallation lösen die Windows-Administratorabfrage aus. Die Installation registriert die aktuell laufende EXE direkt an ihrem vorhandenen Speicherort und startet den Dienst. Programm, Konfiguration, Warteschlange, Protokolle und DPAPI-Geheimnisse bleiben dadurch gemeinsam in diesem Ordner. Der Ordner darf nicht verschoben oder gelöscht werden, solange der Dienst installiert ist. Es sollte ein eigener Programmordner verwendet werden, weil das Programm dem Dienstkonto dort die erforderlichen Lese- und Ausführungsrechte erteilt.
Wenn der Windows-Dienst bereits läuft, startet die Oberfläche keine zweite
lokale Instanz auf denselben Ports. Änderungen werden zunächst in
SMTPAuth365Connector.exe.config gespeichert. Der Dienst übernimmt sie nach Betätigung
von Windows-Dienst neu starten. Unter Program Files sind dafür in der Regel
Administratorrechte erforderlich.
Hinweis zum Klartext-Testmodus: Bei
TestConfiguration.Enabled=Truehaben die einkompilierten Werte Vorrang. Die Oberfläche zeigt in diesem Modus die tatsächlich verwendeten Werte ausTestConfiguration.vban. Das Speichern in der GUI ist deaktiviert, weil diese fest einkompilierten Werte zur Laufzeit nicht geändert werden können. Für die Konfiguration über die Oberfläche mussEnabled=Falsegesetzt und das Programm neu kompiliert werden.
Während des Starts erscheint eine Warnung und im Log wird der unsichere Testmodus vermerkt.
Wichtig: Das Client Secret und die Kennwörter stehen im Klartext im Quellcode und auch in der kompilierten EXE. Vor der produktiven Kompilierung
Enabledwieder aufFalsesetzen und alle echten Geheimnisse ausTestConfiguration.vbentfernen.
Produktive Kompilierung und Installation
SMTPAuth365Connector.slnin Visual Studio 2022 öffnen.- Falls Visual Studio danach fragt, NuGet-Pakete wiederherstellen ausführen.
ReleaseundAny CPUauswählen.- Projektmappe erstellen ausführen.
SMTPAuth365Connector.exestarten und die Einstellungen in der GUI speichern.- Auf Übersicht die Aktion Dienst installieren auswählen und die Windows-Administratorabfrage bestätigen.
Die Dienstinstallation erfolgt vollständig im Programm über die native
Windows-Dienstverwaltung. PowerShell und InstallUtil.exe werden nicht
verwendet. Das gemeinsame lokale SMTP/POP3-Kennwort und das Entra Client Secret
werden über die GUI erfasst und mit Windows DPAPI verschlüsselt gespeichert:
<Programmordner>\Secrets\smtp-password.bin
<Programmordner>\Secrets\oauth-client-secret.bin
Die Speicherung ist fehlersicher ausgeführt: Vor dem Ändern hält das Programm den bisherigen Stand der Konfiguration und der betroffenen Geheimnisdateien im Speicher. Schlägt das Schreiben oder die anschließende vollständige Prüfung fehl, wird der vorherige Stand wiederhergestellt und die lokale Instanz mit diesem Stand erneut gestartet. Eine fehlgeschlagene Dienstinstallation entfernt einen eventuell nur teilweise angelegten Dienst ebenfalls wieder.
Fehler beim erneuten Start der lokalen Instanz
Die Meldung
Diese Instanz hat bereits mindestens eine Anforderung gestartet.
Eigenschaften können nur vor dem Senden der ersten Anforderung geändert werden.
stammte in älteren Projektständen von einem gemeinsam wiederverwendeten HTTP-Client. Nach der ersten OAuth- oder Graph-Anfrage durfte dessen Timeout beim Neustart nicht erneut geändert werden. Ab Version 2.3.1 besitzt jede gestartete Proxy-Instanz einen eigenen, genau einmal konfigurierten HTTP-Client. Bei einem Startfehler werden SMTP, POP3, Warteschlangenverarbeitung und HTTP-Verbindungen vollständig freigegeben. Das Programm muss deshalb nach einem normalen Startfehler nicht mehr beendet werden.
8. Alte Anwendung einstellen
SMTP-Versand
| Einstellung | Wert |
|---|---|
| SMTP-Server | 127.0.0.1 |
| Port | 2525 |
| Authentifizierung | SMTP AUTH LOGIN oder PLAIN |
| Benutzer | Wert aus SmtpUsername |
| Kennwort | Ein gemeinsames Kennwort für alle erlaubten Absender |
| TLS | entsprechend RequireStartTls |
POP3-Abruf
| Einstellung | Wert |
|---|---|
| POP3-Server | 127.0.0.1 |
| Port | 2110 oder der Wert aus Pop3ListenPort |
| Benutzer | vollständige Postfachadresse, zum Beispiel test@kunde.de |
| Kennwort | dasselbe gemeinsame lokale Kennwort wie für SMTP |
| Verschlüsselung | STLS entsprechend Pop3RequireStartTls |
| POP3S/implizites TLS | nicht unterstützt |
Falls der alte Client ausschließlich Port 110 unterstützt, kann
Pop3ListenPort auf 110 gesetzt werden. Bei Zugriff aus dem LAN müssen
Listen-Adresse, AllowedClientAddresses, Windows-Firewall und TLS entsprechend
abgesichert werden.
Verhalten des POP3-Abrufs
- Beim Anmelden wird der aktuelle Graph-Posteingang als Sitzungsliste geladen.
- Pro Postfach ist gleichzeitig nur eine POP3-Sitzung zugelassen, damit zwei Clients nicht widersprüchliche Löschungen ausführen.
- Neue Nachrichten erscheinen bei der nächsten POP3-Anmeldung.
UIDLbasiert auf unveränderlichen Graph-Nachrichten-IDs und bleibt für die Lebensdauer einer Nachricht im Postfach stabil.RETRlädt den originalen MIME-Inhalt über Graph/$value.STATundLISTverwenden vor dem Abruf die von Exchange bereitgestellte ungefähre MAPI-Nachrichtengröße (PidTagMessageSize,0x0E08). NachRETRverwendet die laufende Sitzung die exakte Größe des übertragenen MIME-Inhalts.- Bei
Pop3MarkAsReadOnRetrieval=truewird die Nachricht nach erfolgreichemRETRin Microsoft 365 als gelesen markiert.TOPmarkiert sie nicht gelesen. - Bei
Pop3DeleteTransferredMessages=falsebleiben Nachrichten in Microsoft 365. Nach einem vollständig ausgegebenenRETRspeichert der Dienst die UIDL dauerhaft und bietet diese Nachricht bei späteren Anmeldungen nicht mehr an. - Der Übertragungsstatus liegt je Postfach standardmäßig unter
<Programmordner>\Pop3State. Das gilt auch für den Testmodus, sofern dort kein eigenerDataPathangegeben wurde. - Bei
Pop3DeleteTransferredMessages=truewerden erfolgreich mitRETRübertragene sowie explizit mitDELEmarkierte Nachrichten zur Löschung vorgemerkt. Erst ein sauberesQUITführt die Graph-Löschung aus. - Bei einem Verbindungsabbruch vor
QUITwerden im Löschmodus keine Löschungen ausgeführt; die Nachrichten werden bei der nächsten Anmeldung erneut angeboten. RSEThebt alle Löschvormerkungen der aktuellen Sitzung wieder auf.TOPgilt nicht als vollständige Übertragung und verändert weder den lokalen Übertragungsstatus noch die automatische Löschvormerkung.- Beim späteren Wechsel vom Behalten- in den Löschmodus bleibt die vorhandene Übertragungsliste wirksam. Bereits früher übertragene Mails werden dadurch nicht plötzlich nochmals angeboten oder automatisch gelöscht.
Pop3MaxMessagesbegrenzt die Zahl der je Anmeldung angebotenen Nachrichten. Berücksichtigt werden die neuesten Nachrichten; innerhalb dieser Auswahl wird von alt nach neu nummeriert.Pop3MaxMessageBytesbegrenzt die Größe einer einzelnen heruntergeladenen MIME-Nachricht; der Standard beträgt 50 MiB.
Microsoft: MIME-Inhalt einer Nachricht abrufen
Microsoft: Unveränderliche Outlook-IDs
Lokaler Anmeldungstest ohne TLS:
.\Test-Pop3Proxy.ps1 -Mailbox "test@kunde.de"
Das Skript zeigt STAT und die UIDL-Liste an, ruft aber keine Mail ab und
löscht nichts. Es ist für einen lokalen Funktionstest gedacht. Für LAN-Betrieb
mit erzwungenem STLS verwendest du anschließend den tatsächlichen alten Client.
Sicherheitshinweis: Wer das gemeinsame Kennwort kennt und von einer freigegebenen Client-IP zugreift, kann jedes in
AllowedPop3Mailboxeseingetragene Postfach und jedes Postfach einer inAllowedPop3MailboxDomainseingetragenen Domain öffnen, sofern die Entra-App darauf zugreifen darf. Halte die Freigaben deshalb so klein wie möglich und aktiviere im LAN zwingend STLS. Eine Domainfreigabe ist deutlich weitreichender als die Freigabe einzelner Adressen.
9. Testnachricht
.\Test-SmtpProxy.ps1 `
-From "smtp@firma.at" `
-To "empfaenger@firma.at"
Bei lokal aktiviertem STARTTLS zusätzlich -EnableSsl verwenden.
Test mit einem oder mehreren Anhängen:
.\Test-SmtpProxy.ps1 `
-From "smtp@firma.at" `
-To "empfaenger@firma.at" `
-AttachmentPath "C:\Temp\Test-10MB.pdf"
Protokollierung und Zustellstatus
<Programmordner>\Logs
Mit der Einstellung
<add key="DebugLogging" value="true" />
werden zusätzliche Diagnoseinformationen geschrieben, unter anderem angenommene Verbindungen, SMTP-/POP3-Befehlsnamen, Queue-Prüfungen, Graph-HTTP-Statuswerte, OAuth-Ablaufzeit und bei Fehlern Stacktraces. Kennwörter, SMTP-AUTH-Inhalte, Nachrichtentexte, Client Secrets und OAuth-Tokens werden auch im Debugmodus nicht protokolliert. Nach einer Änderung muss die lokale Instanz oder der Windows-Dienst neu gestartet werden.
Graph bestätigt sendMail mit 202 Accepted. Das bedeutet Annahme, aber noch
keine endgültige Zustellbestätigung. Exchange-Transportregeln, Spamprüfung und
Empfängergrenzen gelten weiterhin.
Nach der Annahme wird eine Kopie im Ordner Gesendete Elemente des dynamisch
aus From: ermittelten Postfachs gespeichert. Für kleine Nachrichten genügt
hierfür Mail.Send; der implementierte Großnachrichtenweg benötigt zusätzlich
Mail.ReadWrite zum Anlegen und Bearbeiten des Entwurfs.
In einem seltenen Grenzfall kann eine Nachricht doppelt versendet werden, wenn Microsoft sie annimmt, aber die HTTP-Antwort den Proxy nicht mehr erreicht.
Sicherheit
- SMTP-Port niemals öffentlich ins Internet stellen.
- POP3-Port niemals öffentlich ins Internet stellen.
AllowedClientAddresses=*nicht produktiv verwenden.AllowedPop3MailboxDomainsnur verwenden, wenn wirklich alle Postfächer der betreffenden Domain über das gemeinsame Kennwort erreichbar sein dürfen.- Im LAN STARTTLS und Windows-Firewall-Regeln verwenden.
- Client Secret rechtzeitig erneuern.
- Wenn möglich Exchange Application RBAC statt globalem
Mail.SendundMail.ReadWriteverwenden. - Dead-Letter-Ordner und Logs überwachen.
Deinstallation
In der GUI auf Übersicht die Aktion Dienst deinstallieren auswählen und die Sicherheitsabfrage sowie die Windows-Administratorabfrage bestätigen.
Programmdateien, Einstellungen, verschlüsselte Geheimnisse, Warteschlange und Logs werden nicht automatisch gelöscht.