Skip to main content

SMTP Auth 365 Connector – SMTP-/POP3-Anbindung für Microsoft 365

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.com und für große Anhänge auf die von Graph gelieferte Upload-URL unter outlook.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

  1. Microsoft Entra Admin Center öffnen.
  2. App-Registrierungen öffnen.
  3. Eine mandanteninterne Anwendung SMTP Auth 365 Connector erstellen.
  4. Anwendungs-ID (Client-ID) notieren.
  5. Verzeichnis-ID (Tenant-ID) notieren.
  6. Unter Zertifikate und Geheimnisse ein Client Secret erstellen.
  7. 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:

  1. API-Berechtigungen öffnen.
  2. Berechtigung hinzufügen wählen.
  3. Microsoft Graph auswählen.
  4. Anwendungsberechtigungen auswählen.
  5. Mail.Send hinzufügen.
  6. Mail.ReadWrite hinzufügen.
  7. 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 AllowedSenderAddresses freigegeben sein.
  • Für alle erlaubten Absender wird dasselbe lokale SMTP-Kennwort verwendet.
  • Nur mit RCPT TO angenommene Empfänger werden an Graph übergeben.
  • Passende ursprüngliche To- und Cc-Empfänger bleiben sichtbar.
  • Verdeckte Empfänger werden als Bcc eingesetzt.
  • 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=True haben die einkompilierten Werte Vorrang. Die Oberfläche zeigt in diesem Modus die tatsächlich verwendeten Werte aus TestConfiguration.vb an. 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 muss Enabled=False gesetzt 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 Enabled wieder auf False setzen und alle echten Geheimnisse aus TestConfiguration.vb entfernen.

Produktive Kompilierung und Installation

  1. SMTPAuth365Connector.sln in Visual Studio 2022 öffnen.
  2. Falls Visual Studio danach fragt, NuGet-Pakete wiederherstellen ausführen.
  3. Release und Any CPU auswählen.
  4. Projektmappe erstellen ausführen.
  5. SMTPAuth365Connector.exe starten und die Einstellungen in der GUI speichern.
  6. 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.
  • UIDL basiert auf unveränderlichen Graph-Nachrichten-IDs und bleibt für die Lebensdauer einer Nachricht im Postfach stabil.
  • RETR lädt den originalen MIME-Inhalt über Graph /$value.
  • STAT und LIST verwenden vor dem Abruf die von Exchange bereitgestellte ungefähre MAPI-Nachrichtengröße (PidTagMessageSize, 0x0E08). Nach RETR verwendet die laufende Sitzung die exakte Größe des übertragenen MIME-Inhalts.
  • Bei Pop3MarkAsReadOnRetrieval=true wird die Nachricht nach erfolgreichem RETR in Microsoft 365 als gelesen markiert. TOP markiert sie nicht gelesen.
  • Bei Pop3DeleteTransferredMessages=false bleiben Nachrichten in Microsoft 365. Nach einem vollständig ausgegebenen RETR speichert 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 eigener DataPath angegeben wurde.
  • Bei Pop3DeleteTransferredMessages=true werden erfolgreich mit RETR übertragene sowie explizit mit DELE markierte Nachrichten zur Löschung vorgemerkt. Erst ein sauberes QUIT führt die Graph-Löschung aus.
  • Bei einem Verbindungsabbruch vor QUIT werden im Löschmodus keine Löschungen ausgeführt; die Nachrichten werden bei der nächsten Anmeldung erneut angeboten.
  • RSET hebt alle Löschvormerkungen der aktuellen Sitzung wieder auf.
  • TOP gilt 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.
  • Pop3MaxMessages begrenzt die Zahl der je Anmeldung angebotenen Nachrichten. Berücksichtigt werden die neuesten Nachrichten; innerhalb dieser Auswahl wird von alt nach neu nummeriert.
  • Pop3MaxMessageBytes begrenzt 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 AllowedPop3Mailboxes eingetragene Postfach und jedes Postfach einer in AllowedPop3MailboxDomains eingetragenen 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.

Microsoft: user sendMail

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.
  • AllowedPop3MailboxDomains nur 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.Send und Mail.ReadWrite verwenden.
  • 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.