Anpassen der Direkt-Lieferung Postfix-Konfiguration

If you have a mail receiver container which requires customised Postfix configuration, this is the topic for you. Herein are described the steps required to set Postfix main.cf configuration variables to whatever your heart desires.

Postfix configuration variables can be set via the container environment. Any environment variable starting with POSTCONF_ will set a Postfix configuration variable named for the rest of the environment variable to the value of the environment variable. For example, if you set the environment variable POSTCONF_always_bcc to bob@example.com, then Postfix will be configured with always_bcc = bob@example.com, which will send a copy of all incoming mail to Bob. Poor Bob.

Procedure

  1. Figure out what configuration variables you want to set, and what values to set them to. This may be done by reading the fine manual, or through recommendations in other Discourse documentation, or otherwise.

  2. Connect to your Discourse server via SSH, grab some root privileges, and head over to where all the discourse-docker configuration lives:

    ssh ubuntu@192.0.2.42
    sudo -i
    cd /var/discourse
    
  3. Open up containers/mail-receiver.yml in your text editor of choice, and swing down to the env: section of the file. Somewhere in there, add entries for the variables you want to add, being careful to not modify anything else, and maintaining appropriate indenting. For example, if we were adding our always_bcc setting, the file might look a bit like this:

    env:
      LANG: en_US.UTF-8
      MAIL_DOMAIN: discourse.example.com
      DISCOURSE_BASE_URL: 'https://discourse.example.com'
      DISCOURSE_API_KEY: abcdefghijklmnop
      DISCOURSE_API_USERNAME: system
    
      POSTCONF_always_bcc: 'bob@example.com'
    

    Once you’re happy with what you’ve added, save and exit your editor.

  4. To load the configuration, you simply have to restart the mail-receiver container (a rebuild is not required):

    ./launcher restart mail-receiver
    

    After a brief spasm, the container should be running again.

  5. Test your changes. Ensure both that what you wanted to have happen has, indeed, happened, and also that nothing you didn’t expect to change hasn’t.

Addendum: adding files to the mail-receiver container

Many Postfix configuration parameters require access to “database files”, which provide key/value information which Postfix uses to make decisions about what do with mail. If you see that a configuration parameter accepts a filename that looks like hash:/some/file, you’ve found a use for database files.

The thing is, Postfix running inside the container needs to be able to get at those files while it’s running, which means you need to either copy those files into the container, or (preferably) put those files into a directory on the host, and then mount that directory as a volume inside the container. These instructions describe the second method.

Once you have completed this procedure, any file you place into /var/discourse/shared/mail-receiver/etc will immediately become visible at /etc/postfix/shared inside the container, and any changes you make to those files will be immediately visible to Postfix.

Here’s how to make it happen.

  1. If you’re not still logged in as root to your Discourse server, do so again:

    ssh ubuntu@192.0.2.42
    sudo -i
    cd /var/discourse
    
  2. Open up containers/mail-receiver.yml in your text editor of choice, and this time head for the volume: section. Underneath the existing definition for the /var/spool/postfix directory, add another one, so that your volume section looks like this:

    volumes:
      - volume:
          host: /var/discourse/shared/mail-receiver/postfix-spool
          guest: /var/spool/postfix
      - volume:
          host: /var/discourse/shared/mail-receiver/etc
          guest: /etc/postfix/shared
    

    Save/exit your editor.

  3. To attach the new volume, you simply have to restart the mail-receiver container (a rebuild is not required):

    ./launcher restart mail-receiver
    

All done!

10 „Gefällt mir“

Matt, do you think that could be possible to enable accounts like admin@domain or info@domain from this Postfix configuration?

I only need to have a couple of addresses for incoming e-mail and I have it working with Discourse but I can’t set accounts (their seem to be blocked by default even though messages are processed).

Thanks for all your guides related.

Ich habe gerade einen Test-Discourse-Dienst mit Digital Ocean und Mailgun für ausgehende E-Mails eingerichtet. Ich habe eine Domain mit einem geeigneten MX-Eintrag, der auf die Digital Ocean IP-Adresse verweist. Ausgehende und eingehende E-Mails funktionieren mit Discourse korrekt. Antworten auf Themen generieren ausgehende E-Mails an diejenigen, bei denen Benachrichtigungen aktiviert sind, und Testbenutzer können auf diese E-Mails antworten, und die Beiträge erscheinen in Discourse. Soweit alles gut.

Ich habe versucht, die Option POSTCONF_always_bcc: wie oben beschrieben hinzuzufügen, aber sie scheint nicht zu funktionieren – ich vermute, dass der ‘mail-receiver’-Teil von Discourse nicht in der Lage ist, die E-Mail ordnungsgemäß über Mailgun zu senden, obwohl der ‘app’-Teil den Benutzernamen und das Passwort des Mailgun-Servers enthält, aber ich habe keine Beispiele gesehen, wie diese Informationen in die mail-receiver-Einstellungen eingegeben werden können.

Ich weiß, dass die always_bcc-Option gelesen und angewendet wird, da ich, wenn ich eingebe:

./launcher enter mail-receiver

dann ausführe

mailq

Ich kann eine Testnachricht sehen, die ich gesendet habe und die in der Warteschlange versucht, zugestellt zu werden. In der Spalte „-Sender/Empfänger-------“ steht die Adresse, von der meine Testnachricht kam, die Worte „(unbekannter Mail-Transportfehler)“ und dann die E-Mail-Adresse, die ich in der always_bcc-Einstellung hatte.

Ich hatte gehofft, eingehende Nachrichten irgendwie zu filtern, so dass, wenn eine Nachricht an postmaster@mydomain oder admin@mydomain gesendet wurde, sie über Mailgun über das öffentliche Internet an meine Gmail-Adresse weitergeleitet würde und nicht zur Verarbeitung an Discourse gesendet würde. Dies ist vielleicht das, was Benutzer @satonotdead zu tun versucht hat.

Jeder Hinweis ist willkommen, wie das gemacht werden kann!

Hmm. Ja, zuerst müssen Sie den Mailgun Mail-Empfänger so konfigurieren, dass er eine Möglichkeit zur Zustellung von E-Mails hat, da er nichts über die Anmeldeinformationen oder den Transportmechanismus in app.yml weiß. Ich denke, Sie müssen eine vollständigere Konfiguration hinzufügen, wie im nächsten Abschnitt über das Mounten von Volumes angedeutet, dessen Details über den Rahmen dieses Dokuments hinausgehen.

Die einfache Lösung für „Wie gehe ich mit postmaster- und admin-E-Mails um?“ besteht darin, für jede eine Gruppe zu erstellen und jeden hinzuzufügen, der diese E-Mails erhalten soll, zu dieser Gruppe, und sie können diese als Gruppen-Nachrichten behandeln.

2 „Gefällt mir“

Meinten Sie „Mail-Empfänger“ statt Mailgun? So wie man dem „Mail-Empfänger“ beibringt, über das öffentliche Internet mit Mailgun zu sprechen und Anmeldeinformationen ordnungsgemäß weiterzugeben, um ihn zu bitten, die eigentlichen Zustellungen durchzuführen?

Ja. Entschuldigung dafür.

Nun ja, das oder auf irgendeine andere Weise den Mail-Receiver (d. h. Postfix) so konfigurieren, dass er E-Mails zustellt. Ich bin größtenteils der Meinung, dass man, wenn man weiß, wie das geht, es eher tun würde, anstatt den Mail-Receiver zu verwenden.

Eine andere Lösung wäre, einen Prozess <mail thing> zu haben, der die E-Mail für domain verarbeitet und den Rest an den Mail-Receiver weiterleitet, vielleicht unter einer anderen MX.

Nachdem ich diesen Abend damit verbracht habe, zahlreiche Kombinationen auszuprobieren, ist es mir gelungen, Postfix außerhalb der Container zu installieren, in denen Discourse läuft, und kann auf diese Weise E-Mails über Mailgun von der Kommandozeile aus senden. Daher habe ich Postfix erfolgreich für die Verwendung von Mailgun konfiguriert. Ich bin immer noch ratlos, wie ich die Einstellungen in den Mail-Receiver-Container bekomme, damit die Weiterleitung über Mailgun funktioniert. Ich bin sicher, dass es einen (einfachen!) Weg geben muss. Ich kann keine Protokolle finden, um herauszufinden, warum Nachrichten in der Mail-Warteschlange feststecken. Container gab es nicht, als ich Linux das letzte Mal benutzte (vor einigen Jahren). Gibt es eine Möglichkeit, die Protokollierung zu aktivieren, damit ich sehen kann, welche Kommunikation Postfix zu versuchen versucht, um das Problem zu identifizieren? Konzeptionell möchte ich, dass admin@mydomain, sobald es eingegangen ist, über Mailgun direkt an mein persönliches Gmail-Konto gesendet wird, während category1@mydomain und category2@mydomain usw. lokal an Discourse weitergeleitet werden, um Beiträge zu erstellen.

2 „Gefällt mir“

Können wir den Mail-Empfänger außerhalb der Discourse-Container auf einem anderen VPS oder Rechenzentrum verwenden?

Die Idee ist, die IP-Adresse von Discourse für mehr Privatsphäre zu ändern und einen externen “Mail-Empfänger” zu verwenden, der mit dem Discourse-Forum funktioniert/authentifiziert.

Ja. Ich mache genau das. Ich lasse den Mail-Empfänger bei Digital Ocean laufen und Discourse auf Maschinen in einem anderen Rechenzentrum.

Kann mir jemand erklären, wie das geht? Dieser Typ verlangt Geld, nur um mir zu antworten.

Was ist Ihre Frage?

Es ist nichts Besonderes erforderlich, um den Mail-Empfänger auf einem beliebigen Server zu konfigurieren, solange dieser Docker und Zugriff auf die notwendigen Ports hat.

Ich habe den Mail-Empfänger eingerichtet, da er schnell und einfach ist. Wenn ich jedoch versuche, die E-Mails zu verarbeiten, erhalte ich eine 404-Meldung.

Meine Website ist ein Subdomain, z.B.: forum.site.com

Und im App-Mail-Empfänger habe ich dies für den Endpunkt:

DISCOURSE_MAIL_ENDPOINT: ‘http://forum.site.com/admin/email/handle_mail

Sollte ich Discourse auch neu erstellen?

Wenn Sie 404 erhalten, ist wahrscheinlich der API-Schlüssel falsch.

2 „Gefällt mir“

Es ist die Standard-API und gibt mir immer noch 404… ich schicke es dir in Google Talk, bitte überprüfe es.

1 „Gefällt mir“

SMTP-Banner konfigurieren?

MXtoolbox’s SuperTool meldet ein Problem mit der SMTP-Banner-Überprüfung.
image

Normalerweise sollte das EHLO-Banner mit der MAIL_DOMAIN übereinstimmen, die wiederum mit dem Reverse-DNS-Pointer (PTR-Eintrag) übereinstimmen soll. Wenn also mein mail-receiver unter discourse.example läuft, dann sollte POSTCONF_myhostname discourse.example sein.

Was ist der richtige Weg, das EHLO-Banner zu konfigurieren?

Meine erste Intuition war, zu versuchen, HOSTNAME in mail-receiver.yml zu setzen, damit es host-mail-receiver.localdomain in /etc/postfix/mail-receiver-environment.json ersetzt. Aber das ändert weder /etc/hostname noch myhostname in der Postfix-Konfiguration.

Ich bin versucht, POSTCONF_myhostname zu verwenden, aber ich befürchte, dass dies unerwünschte Nebenwirkungen haben wird, da $myhostname an mehreren Stellen verwendet wird und dann nicht mehr mit /etc/hostname übereinstimmt.

root@host-mail-receiver:/etc/postfix# postconf | grep myhostname
lmtp_lhlo_name = $myhostname
local_transport = local:$myhostname
milter_macro_daemon_name = $myhostname
myhostname = host-mail-receiver.localdomain
myorigin = $myhostname
smtp_helo_name = $myhostname
smtpd_proxy_ehlo = $myhostname
root@host-mail-receiver:/etc/postfix# cat /etc/hostname
host-mail-receiver

Discourse-setup fragt nach einer Einstellung. Ich kann mich nicht an den Namen erinnern und er ist auf meinem Handy schwer zu finden. Sie können sich den Quellcode ansehen oder ihn ausführen.

Die Postfix-Einstellung smtp_helo_name ändert den Namen, der im HELO- (oder EHLO-)Befehl angegeben wird, aber dies ist eine Einstellung für die ausgehende Zustellung, während das SMTP-Banner beim Empfangen von E-Mails gesendet wird. Der dort angegebene Standardhostname wird von myhostname übernommen, aber Sie können das Banner mit der Einstellung smtpd_banner so ändern, dass etwas anderes angezeigt wird.

1 „Gefällt mir“

Ich bin mir nicht sicher, ob das anderen helfen wird. Ich hatte ein ähnliches Problem und das hat mir geholfen zu erkennen, dass ich aus irgendeinem Grund den API-Schlüssel widerrufen hatte. Sobald ich den Widerruf rückgängig gemacht habe, funktionierte die eingehende E-Mail wieder.

Vielen Dank, dass Sie mir geholfen haben zu erkennen, dass es mit dem API-Schlüssel zusammenhing :slightly_smiling_face:

1 „Gefällt mir“

Hat sich seitdem vielleicht etwas geändert? Ich habe gerade festgestellt, dass das Hinzufügen eines POSTCONF_smtpd_banner-Wertes unter env: bei mehreren Neustarts absolut nicht übernommen wurde. Ich musste neu bauen (./launcher rebuild mail-receiver), damit es wirksam wurde.