Es gibt zwei Möglichkeiten, E-Mails über einen lokalen SMTP-Server zu versenden:
- Verbindung zum Submission-Port herstellen und authentifizieren, z. B. 587 mit STARTTLS oder 465 mit implizitem/sofortigem TLS => Netzwerkanfrage, Prüfungen und Einschränkungen, die über
smtpdangewendet werden sendmailoder ähnliches verwenden, das den lokalenpickup-Befehl aufruft (im Falle von Postfix), keine Netzwerkverbindung herstellt und alle für densmtpd-Submission-Dienst konfigurierten Prüfungen und Einschränkungen umgeht.
Letzteres ist einfacher und schneller, in gängige Laufzeitsysteme und Frameworks wie PHP Mailer und diese Ruby Mail-Bibliothek, die von Discourse verwendet wird, integriert. Und die Authentifizierung wird umgangen, es müssen keine Klartext-Anmeldeinformationen irgendwo gespeichert werden. Oder anders ausgedrückt: Der SMTP-Server wird in diesem Fall überhaupt nicht verwendet, sondern nur der SMTP-Client.
Ich meine, ja, die Submission-Port-Verbindungsgeschichte sollte im Vergleich zu dem, was Discourse sonst tut, keine signifikanten Auswirkungen auf die Serverlast haben. Letzterer Punkt kann mit z. B. der Regel smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject am Submission-Port gelöst werden, um Einreichungen von Loopback-IPs (Standard, mynetworks-Einstellung) zu erlauben, bevor eine Authentifizierung erfolgt. Wenn die Anfrage vom Container mit einer anderen IP gesehen wird, kann diese zu mynetworks hinzugefügt werden. Ich schätze, so funktionierte es im Fall des Themas, das ich zuvor verlinkt habe.
Das werde ich beim nächsten Update/Rebuild unseres Discourse sehen, wenn die geänderten SMTP-Einstellungen angewendet werden. Ich werde berichten, wie es funktioniert.
Aber es wäre immer noch interessant zu wissen, ob es andere Wege gibt und was es mit dieser Einstellung “Delivery method” auf sich hat.
Postfix läuft auf dem Host, nicht in einem Container, aber es würde keinen großen Unterschied machen, da es sich weiterhin um eine netzwerkbasierte Authentifizierung handelt.
Ja, ein Gedanke später: Es ist nur logisch, dass sendmail usw. vom Host/anderen Container nicht innerhalb eines Containers funktionieren können, da es direkten Zugriff auf weite Teile der Postfix-Executables, Bibliotheken und Konfigurationen erfordert, nehme ich an. Es sei denn, es gibt eine Art magischen Socket, der in den Container eingebunden werden kann oder so
.