Konfigurieren Sie eingehende Direktversand-E-Mails für selbstgehostete Websites mit Mail-Receiver

Hallo! Ich habe ein seltsames Problem, bei dem ich dies gemäß der Anleitung eingerichtet habe und es funktioniert hervorragend! Etwas ist jedoch mit dem ausgehenden E-Mail-Verkehr schiefgelaufen, von dem ich dachte, dass er von all dem nicht betroffen wäre. Sidekiq gibt für jede versuchte E-Mail (alle im Wiederholungs-Listen-Bereich feststeckend), seit ich mail-receiver aktiviert habe, den folgenden Fehler aus:

Jobs::HandledExceptionWrapper: Wrapped OpenSSL::SSL::SSLError: SSL_read: unexpected eof while reading

Meine Suche führt mich zu der Annahme, dass dies irgendwie mit TLS zusammenhängt. Ich hatte die TLS-bezogenen Zeilen in der .yml-Datei auskommentiert, aber das erneute Auskommentieren hat das Problem auch nicht behoben. Ich habe die Anweisungen in der Anleitung zur Behebung von Postfix-Konflikten ausprobiert, aber anscheinend habe ich kein Postfix? (Das Verzeichnis /etc/postfix in der Anleitung existiert auf meiner Instanz nicht, und es erkennt auch Postfix nicht als Dienst.) Und laut den Netstat-Ergebnissen verwendet nur docker-proxy Port 25.

Wir verwenden Gmail als ausgehenden SMTP-Dienst, und tatsächlich haben wir Gmail bereits für eingehende POP3-Abfragen genutzt, bevor dies geschah. Ich habe zwar eine Reihe von MX-Einträgen gelöscht, die auf Google zeigten, aber die Anleitung sagte, ich solle das tun.

Dies ist meine mail-receiver.yml, mit bestimmten Details natürlich geschwärzt:

## Dies ist die Vorlage für den eingehenden E-Mail-Empfänger-Container
##
## Nach Änderungen an dieser Datei MÜSSEN Sie neu erstellen
## /var/discourse/launcher rebuild mail-receiver
##
## SEIEN SIE SEHR VORSICHTIG BEIM BEARBEITEN!
## YAML-DATEIEN SIND SUPER SUPER EMPFINDLICH GEGENÜBER FEHLERN BEI LEERZEICHEN ODER AUSRICHTUNG!
## Besuchen Sie http://www.yamllint.com/, um diese Datei bei Bedarf zu validieren.

base_image: discourse/mail-receiver:release
update_pups: false

expose:
  - "25:25"   # SMTP

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

  ## Wohin E-Mails an Ihr Forum gesendet werden sollen. Im Allgemeinen ist es vollkommen in Ordnung,
  ## dieselbe Domain wie das Forum selbst hier zu verwenden.
  MAIL_DOMAIN: discourse.[mydomain].org
# kommentieren Sie diese (und das Volumen unten!) aus, um TLS zu unterstützen
  POSTCONF_smtpd_tls_key_file:  /letsencrypt/discourse.[mydomain].org/discourse.[mydomain].org.key
  POSTCONF_smtpd_tls_cert_file:  /letsencrypt/discourse.[mydomain].org/fullchain.cer
  POSTCONF_smtpd_tls_security_level: may


  ## Die Basis-URL für diese Discourse-Instanz.
  ## Dies wird Ihre Discourse-Site-URL sein. Zum Beispiel,
  ## https://discourse.example.com. Wenn Sie eine Subfolder-Einrichtung betreiben,
  ## stellen Sie sicher, dass Sie dies berücksichtigen (d. h. https://example.com/forum).
DISCOURSE_BASE_URL: 'https://discourse.[mydomain].org'

  ## Der Master-API-Schlüssel Ihres Discourse-Forums. Sie können diesen aus
  ## dem Reiter "API" in Ihrem Admin-Panel erhalten.
  DISCOURSE_API_KEY: [myapikey]

  ## Der Benutzername, der für die Verarbeitung eingehender E-Mails verwendet wird. Sofern Sie
  ## den Benutzer `system` nicht umbenannt haben, sollten Sie dies so belassen.
  DISCOURSE_API_USERNAME: system

volumes:
  - volume:
      host: /var/discourse/shared/mail-receiver/postfix-spool
      guest: /var/spool/postfix
# auskommentieren, um TLS zu unterstützen
  - volume:
      host: /var/discourse/shared/standalone/letsencrypt
      guest: /letsencrypt

E-Mail-Technik liegt etwas außerhalb meiner Expertise, daher schätze ich jeden Rat, auch wenn es nur darum geht, mich darauf hinzuweisen, dass ich etwas Dummes übersehen habe, als ich das eingerichtet habe. Danke!

1 „Gefällt mir“

Wie Sie vermutet haben, hat es nichts mit dem Nackenempfänger zu tun. Der Host, über den Sie E-Mails senden, hat ein fehlerhaftes SSL-Zertifikat.

Nun, ich habe es nach viel Fehlerbehebung herausgefunden. Das Problem kam wahrscheinlich daher, dass die Domain, auf der wir unsere Discourse-Instanz hosten, nicht dieselbe ist wie die Domain, auf der unsere MX-Einträge waren. Sobald ich diese Verwirrung überwunden hatte, fügte sich alles zusammen.

Es ist definitiv mein eigener dummer Fehler, aber die Anleitung hat zu meiner Verwirrung beigetragen:

Es ist nicht ganz klar, dass die beiden forum.example.com-Einträge nicht identisch sein müssen, und in meinem Fall mussten sie unterschiedlich sein. Das ist vielleicht etwas, das Leute, die diese Anleitung verwenden, erfahren genug sein sollten, um es zu wissen, aber ich war es nicht. Daher hinterlasse ich dies für alle anderen, die auf ein ähnliches Problem stoßen könnten. Ich habe ein paar Dinge über DNS gelernt, die ich nicht wusste, also war dies eine gute Lernerfahrung, und jetzt funktioniert alles bestens. :slight_smile:

Nun, ich habe mich zu früh gefreut. Ausgehende E-Mails funktionieren einwandfrei, eingehende Antworten scheinen ebenfalls zu funktionieren, aber das Posten an die E-Mail-Adresse einer Kategorie schlägt still und heimlich fehl. Ich habe die Adresse direkt aus den Einstellungen in eine neue E-Mail kopiert und eingefügt, daher weiß ich, dass es keine Tippfehler gibt.

Die Protokolle meines mail-receiver enthalten im Grunde drei Arten von Einträgen. Der erfolgreiche, der eine per E-Mail gesendete Antwort auf einen bestehenden Beitrag war, sieht so aus:

Sep 20 16:59:44 discourse-mail-receiver postfix/smtpd[277]: connect from server168-1.web-hosting.com[68.65.122.144]
Sep 20 16:59:45 discourse-mail-receiver postfix/smtpd[277]: NOQUEUE: reject: RCPT from server168-1.web-hosting.com[68.65.122.144]: 454 4.7.1 <[category]@discourse.[domain].org>: Relay access denied; from=<ryan@[redacted].com> to=<[category]@discourse.[domain].org> proto=ESMTP helo=<server168-1.web-hosting.com>
<22>Sep 20 16:59:45 policyd-spf[288]: : prepend Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=[redacted]; helo=server168-1.web-hosting.com; envelope-from=ryan@[redacted].com; receiver=discourse.[domain].org Sep 20 16:59:45 discourse-mail-receiver postfix/cleanup[281]: 4CCED114200: message-id=<20240920165945.4CCED114200@discourse-mail-receiver.localdomain>
Sep 20 16:59:45 discourse-mail-receiver postfix/smtpd[277]: disconnect from server168-1.web-hosting.com[68.65.122.144] ehlo=1 starttls=0/1 mail=1 rcpt=0/1 data=0/1 quit=1 commands=3/6

Abgesehen davon gibt es zwei Arten von (vermutlich) Fehlern, die sich jeweils ziemlich oft wiederholen. Der erste sieht so aus:

Sep 20 17:00:23 discourse-mail-receiver postfix/qmgr[124]: 5D162FC26D: from=<double-bounce@discourse-mail-receiver.localdomain>, size=960, nrcpt=1 (queue active)

Und der andere:

Sep 20 17:00:23 discourse-mail-receiver postfix/error[293]: 8DC3BFC141: to=<postmaster@discourse-mail-receiver.localdomain>, orig_to=<postmaster>, relay=none, delay=126622, delays=126622/0.05/0/0, dsn=4.4.3, status=deferred (delivery temporarily suspended: Host or domain name not found. Name service error for name=discourse-mail-receiver.localdomain type=MX: Host not found, try again)

Und hier ist, wie meine mailq aussieht, nur Einträge wie dieser immer und immer wieder:

3D07BFC23D      960 Fri Sep 20 06:42:23  double-bounce@discourse-mail-receiver.localdomain
(delivery temporarily suspended: Host or domain name not found. Name service error for name=discourse-mail-receiver.localdomain type=MX: Host not found, try again)
                                         postmaster@discourse-mail-receiver.localdomain

Ein Teil davon scheint mit E-Mails zu tun zu haben, die Discourse sendet und die dann aus irgendeinem Grund zurückgewiesen werden. Hat mail-receiver irgendeine Funktionalität, um diese Bounces zu verarbeiten, oder werden sie für immer in der Mailq verbleiben?

Zweitens, warum funktionieren Antworten, aber das direkte Posten per E-Mail an eine Kategorie nicht? Vielen Dank nochmals für Ihre Hilfe und Ihre Geduld. :slight_smile:

[quote=“Ryan Hyer, post:514, topic:49487, username:Ryan_Hyer”]Der erfolgreiche, der eine per E-Mail gesendete Antwort auf einen bestehenden Beitrag war, sieht so aus:

...
454 4.7.1 <[category]@discourse.[domain].org>: Relay access denied;
...

[/quote]

Das sieht eher nach den Log-Einträgen für das Scheitern einer E-Mail an eine Kategorieadresse aus als für eine erfolgreiche Antwort auf einen Beitrag.

[quote=“Ryan Hyer, post:514, topic:49487, username:Ryan_Hyer”]Zweitens, warum funktionieren Antworten, aber das direkte Posten per E-Mail an eine Kategorie nicht?
[/quote]

Ich bin mir nicht zu 100 % sicher, aber ich glaube, relay access denied deutet darauf hin, dass discourse.[domain].org wahrscheinlich nicht die Domain ist, die für MAIL_DOMAIN in mail-receiver.yml verwendet wird. Möglicherweise wird die Antwortadresse auf andere Weise zugelassen.

Ich weiß, dass das, was in MAIL_DOMAIN verwendet wird, an mindestens einer Stelle in einer Postfix-Konfigurationsdatei landet. Daher erfordert eine Änderung wahrscheinlich einen Neuaufbau des Containers. Haben Sie MAIL_DOMAIN geändert und, falls ja, danach ./launcher rebuild mail-receiver ausgeführt?

2 „Gefällt mir“

[Entschuldigung, dass ich versehentlich zu früh Enter gedrückt habe, bevor ich meinen vorherigen Beitrag beendet habe]

Ich schlage mir immer noch den Kopf an diesem Problem wund. Aber ich habe eine neue Idee, woran das Problem liegen könnte. Ich arbeite mit zwei Domains, nennen wir sie [domain1] und [domain2]. Mein Gmail SMTP-Relay wird auf [domain1] gehostet. Meine Discourse-Instanz sowie mein mail-receiver werden auf [domain2] gehostet.

Wie stelle ich die Einstellung reply-by-email-address in Discourse so ein, dass eine Antwortadresse in [domain2] erzwungen wird, wenn die E-Mail von [domain1] gesendet wird? Ich erhalte die oben erwähnte SSL EOF-Fehlermeldung, wenn ich versuche, dies zu tun. Ich gehe davon aus, dass es sich um eine DNS-Authentifizierungstrickerei oder etwas handelt, das ich übersehe.

Ich glaube, ich habe es endlich herausgefunden. Um sicherzustellen, dass die ‘reply-to’-Adresse in einer anderen Domain als der des SMTP-Relais liegt, musste ich einige Einstellungen in Google Workspace lockern. Alles scheint in beide Richtungen wie vorgesehen zu funktionieren.

1 „Gefällt mir“

Eine letzte Frage hier. Obwohl jetzt alles korrekt funktioniert, habe ich immer noch eine Menge alter Einträge in meiner mailq. Das sind höchstwahrscheinlich E-Mails, die mit den falschen Einstellungen generiert wurden und daher für immer in der Schwebe bleiben werden. Ich würde sie lieber löschen und weitermachen. Wie lösche ich also die mailq?

Ein etwas alter Beitrag, aber vielleicht ist der häufigste Grund für einen SSL EOF-Fehler ein Konflikt zwischen OpenSSL-Versionen: v1.1.1f vs v3. Ein Upgrade des alten 1.1.1f wird die Lösung sein. Und die schlechte Nachricht ist, dass zum Beispiel Ubuntu 20.x nicht das neuere verwenden kann, sodass das gesamte Ubuntu aufgerüstet werden muss.

1 „Gefällt mir“

Ich bin am Ende meines Lateins, nachdem ich Stunden damit verbracht habe. Ich scheine diesen Launcher-Fehler nicht überwinden zu können, obwohl meine Konfigurationsdateinamen alle Kleinbuchstaben enthalten.

„FEHLER: Der Konfigurationsname darf keine Großbuchstaben, Leerzeichen oder Sonderzeichen enthalten. Korrigieren Sie den Konfigurationsnamen und führen Sie ./launcher erneut aus.“

während der Ausführung von

./launcher rebuild mail-receiver

oder

./launcher bootstrap mail-receiver

oder

./launcher start mail-receiver

Ich kann es hier im Launcher-Code sehen

Grrrrrrrrrr – Bitte helft!

Habe alles im verlinkten Beitrag oben bezüglich Locale versucht und alles, was ich sonst noch finden konnte.

./launcher rebuild app___ funktionieren alle einwandfrei!

Ich habe einen möglichen Hinweis: Dies begann unmittelbar nachdem ich versehentlich die Feststelltaste gedrückt hatte (aber nur 2 der Buchstaben großgeschrieben habe), während ich die Konfigurationsdatei benannt habe, die ich dann sofort die Feststelltaste deaktiviert und die 2 Buchstaben neu eingegeben habe, bevor ich sie überhaupt gespeichert habe.

Es ist schwer vorstellbar, wie dieser kurze Tippfehler/diese Korrektur dies verursacht haben könnte, aber vielleicht sind die Großbuchstaben irgendwo in einem Puffer hängen geblieben oder ???

Das übersteigt mein Wissen, aber ich bin überrascht, dass die Fehlermeldung die Variable $config nicht ausgibt :thinking:
Das würde sicher bei der Fehlersuche helfen.

1 „Gefällt mir“

Danke @Canapin! - Das ist es, was ich einzurichten versuche:

https://www.perplexity.ai/search/provide-the-code-lJcI4BrFQ2auuD42ehYFwA

Können Sie den gesamten Inhalt Ihrer Befehlszeile kopieren und einfügen?

Von Ihrem ./launcher start mail-receiver bis zur Fehlermeldung, sowie den genauen .yml-Dateinamen?

Wenn ich die Konfigurationsdatei in Mail-receiver.yml umbenenne, gibt ./launcher start Mail-receiver Folgendes aus:

ERROR: Config name 'Mail-receiver' must not contain upper case characters, spaces or special characters. Correct config name and rerun ./launcher.

Hier enthält die Fehlermeldung den Dateinamen.

Wenn Sie ./launcher start aaa ausführen, wird keine entsprechende Datei gefunden und die verfügbaren aufgelistet. Sie werden nur aus dem Ordner übernommen, es gibt also keine Magie, aber vielleicht gibt es etwas Interessantes aus :person_shrugging:

ERROR: containers/aaa.yml does not exist or is not readable.

Available configs ( app, mail-receiver )

Vielen Dank – ich habe es sortiert und zum Laufen gebracht.

Was war das Problem am Ende? Könnte anderen helfen :slight_smile:

Es gab kein Problem, es war wirklich nur eine Lernkurve, um zu verstehen, wie die verschiedenen Serverkomponenten für das Routing von Domains und E-Mails interagieren. Ich hatte mich zuvor nie mit Postfix beschäftigt. Es hat Spaß gemacht und ich habe viel gelernt.

Das Rezept, zu dem ich schließlich gekommen bin, ist die Verwendung einer mail-receiver.yml (ein Docker-Container), die mit jeder Instanz von Discourse gekoppelt ist und sich allen den Port 25 teilen, wobei die Transportfunktion in Postfix für das Routing verwendet wird.

2 „Gefällt mir“

Auf meinem dedizierten Server (mit Ubuntu 22.04 und installiertem Postfix) verwende ich eine separate mail-receiver.yml-Datei, die mit jeder Discourse-Instanz verknüpft ist, bei der ich die Funktion für E-Mail-Beiträge aktiviert habe.

Diese Konfiguration erstellt einen separaten Container für jede Discourse-Instanz auf meinem Server (neben dem typischen app-Container), der die E-Mails für die entsprechende Discourse-Instanz empfängt und verarbeitet.

Eingehende E-Mails für alle Discourse-Foren auf dem Server werden von Postfix über den Standardport 25 empfangen, wobei die Hauptkonfigurationsdatei von Postfix eine „Transport Map“ verwendet, um jede E-Mail an das vorgesehene Discourse-Forum zu „relaysen“, indem der Domainname in der „To:“-Adresse der E-Mail analysiert wird.

Daher habe ich zusätzlich zu den Anweisungen dieses Themas Folgendes getan:

  1. Die vorhandene Postfix-Konfigurationsdatei modifiziert unter: /etc/postfix/main.cf

  2. Dann habe ich die entsprechende Postfix-Transport-Map Datei hinzugefügt unter: /etc/postfix/transport

  1. Zuletzt habe ich die entsprechenden Dateien hinzugefügt, um den E-Mail-Container für jedes der Foren zu erstellen:
    /var/discourse/containers/mail-receiver-domain1.yml
    /var/discourse/containers/mail-receiver-domain2.yml
    /var/discourse/containers/mail-receiver-domain3.yml
    /var/discourse/containers/mail-receiver-domain4.yml
    /var/discourse/containers/mail-receiver-domain5.yml

3 „Gefällt mir“

In mail-receiver.yml gibt es kein DISCOURSE_MAIL_ENDPOINT, und es gibt auch DISCOURSE_BASE_URL zu ändern.

2 „Gefällt mir“

Ich nutze einen E-Mail-Weiterleitungsdienst, der das Weiterleiten von E-Mails im JSON-Format an einen Webhook unterstützt.

Ist dies eine Option für die direkte Zustellung von E-Mails?

1 „Gefällt mir“