Diskussion mit anderen Websites, SMTP-Problem: Dateiende erreicht

(an das Personal: Dies hat nichts mit dem gehosteten Abonnement zu tun, mit dem mein Konto ebenfalls verknüpft ist)

Ich habe Discourse auf einem VPS gemäß den Anweisungen unter Run other websites on the same machine as Discourse installiert, jedoch mit einem Unterschied: Ich habe die app.yml vor der ersten Installation angepasst:

sudo mkdir /var/discourse
sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
sudo cp samples/standalone.yml containers/app.yml
sudo nano containers/app.yml

In der YAML-Datei habe ich den Abschnitt für die Ports auskommentiert, - "templates/web.socketed.template.yml" hinzugefügt und Hostname sowie SMTP konfiguriert:

  ## TODO: Der Domainname, auf den diese Discourse-Instanz antworten soll
  ## Erforderlich. Discourse funktioniert nicht mit einer reinen IP-Adresse.
  DISCOURSE_HOSTNAME: 'discuss.mydomain.community'

  ## TODO: Liste der durch Komma getrennten E-Mail-Adressen, die bei der ersten Registrierung zu Admins und Entwicklern werden
  ## Beispiel: 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'someuser@protonmail.com,anotheruser@otherdomain.io'

  ## TODO: Der SMTP-Mailserver, der zur Validierung neuer Konten und zum Senden von Benachrichtigungen verwendet wird
  # SMTP-Adresse, Benutzername und Passwort sind erforderlich
  # WARNUNG: Das Zeichen '#' im SMTP-Passwort kann Probleme verursachen!
  DISCOURSE_SMTP_ADDRESS: smtp.myprovider.email
  DISCOURSE_SMTP_PORT: 465
  DISCOURSE_SMTP_USER_NAME: mydomain-no-reply@otherdomain.io
  DISCOURSE_SMTP_PASSWORD: pa$$word
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, Standard: true)

Anschließend habe ich die Discourse-App initialisiert und gestartet:

sudo ./launcher bootstrap app
sudo ./launcher start app

Das hat funktioniert. Ich habe Discourse gestoppt und den externen Nginx (in /etc/nginx/conf.d/discourse.conf) mit der empfohlenen HTTP-only-Konfiguration konfiguriert (nur zum Testen). Ich konnte auf http://discuss.mydomain.community zugreifen.

Ich habe Discourse erneut gestoppt und mit Certbot die discourse.conf aktualisiert. Jetzt habe ich Folgendes:

server {
	server_name discuss.mydomain.community;  # <-- ändern Sie dies

	location / {
		proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
		proxy_set_header Host $http_host;
		proxy_http_version 1.1;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_set_header X-Real-IP $remote_addr;
	}

    listen [::]:443 ssl ipv6only=on; # verwaltet von Certbot
    listen 443 ssl; # verwaltet von Certbot
    ssl_certificate /etc/letsencrypt/live/discuss.mydomain.community/fullchain.pem; # verwaltet von Certbot
    ssl_certificate_key /etc/letsencrypt/live/discuss.mydomain.community/privkey.pem; # verwaltet von Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # verwaltet von Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # verwaltet von Certbot

}
server {
    if ($host = discuss.mydomain.community) {
        return 301 https://$host$request_uri;
    } # verwaltet von Certbot


	listen 80; listen [::]:80;
	server_name discuss.mydomain.community;
    return 404; # verwaltet von Certbot
}

Bisher so weit, so gut. Ich kann über HTTPS auf Discourse zugreifen (später habe ich ein ./launcher rebuild app durchgeführt, als Dinge nicht funktionierten, aber das brachte keine Veränderung).

Auf dem Bildschirm „Installation abschließen“ nach Absenden des Registrierungsformulars erscheint die Meldung: „Wir haben eine Aktivierungs-E-Mail an `someuser@protonmail.com`` gesendet“.

Problem: Keine E-Mail kommt an.

Keine E-Mail trifft im Posteingang des Administrators ein. Auch im Postfach von mydomain-no-reply@otherdomain.io ist nichts zu sehen.

Hinweis: Das gesamte Problem könnte dadurch verursacht sein, dass der Mail-Benutzer auf otherdomain.io liegt und auf mydomain.community residieren muss. Soweit ich weiß, ist dies jedoch keine Voraussetzung.

Ich habe mit der Fehlersuche begonnen und anschließend folgende Änderungen an der app.yml getestet (mit einem rebuild app dazwischen):

  DISCOURSE_SMTP_ENABLE_START_TLS: false

Kein Erfolg. Weiter geht es:

## Wenn Sie die „Von“-E-Mail-Adresse für Ihre erste Registrierung festlegen möchten, kommentieren Sie dies aus und ändern Sie es:
  - exec: rails r "SiteSetting.notification_email='mydomain-no-reply@otherdomain.io"

Daraufhin bin ich wie unter Troubleshoot email on a new Discourse install vorgegangen:

  • otherdomain.io hat DKIM und SPF korrekt in DNS eingestellt
  • Telnet von der VPS zum SMTP-Anbieter funktioniert
  • Telnet aus dem Docker-Container (mit docker exec und installiertem Telnet) funktioniert ebenfalls

Ich habe ./discourse-doctor ausgeführt, und zwei Teile sind hervorgehoben (der Rest der Ergebnisse war wie erwartet):

========================================
Discourse-Version auf discuss.mydomain.community: Discourse 2.6.0.beta2 
Discourse-Version auf localhost: NICHT GEFUNDEN
==================== DNS-PROBLEM ====================
Dieser Server meldet NICHT GEFUNDEN, aber discuss.mydomain.community meldet Discourse 2.6.0.beta2.
Das deutet auf ein DNS-Problem hin oder dass ein dazwischengeschalteter Proxy schuld ist.
Wenn Sie Cloudflare oder ein CDN verwenden, ist dies möglicherweise falsch konfiguriert.
==================== MAIL-TEST ====================
Für einen robusten Test holen Sie sich eine Adresse unter http://www.mail-tester.com/
Senden von E-Mail an REDAKTIERTE ... 
Testen des Sendens an test-k86jiyqb9@srv1.mail-tester.com unter Verwendung von smtp.myprovider.email:465.
======================================== FEHLER ========================================
                                    UNERWARTETER FEHLER

Ende der Datei erreicht

====================================== LÖSUNG =======================================
Dies ist kein häufiger Fehler. Es existiert keine empfohlene Lösung!

Bitte melden Sie die genaue Fehlermeldung oben an https://meta.discourse.org/
(und eine Lösung, falls Sie eine finden!)

Ich habe es zweimal versucht. Einmal mit der konfigurierten E-Mail-Adresse, einmal mit einer von mail-tester.com bereitgestellten. Gleiche Ergebnisse. Das sieht also nicht gut aus.

Hinweis: Offenbar liefert das Docker-Installationsverfahren auch Beta-Versionen. Gut zu wissen.

In der Produktionsprotokolldatei steht:

Started GET "/" for REDACTED-IP at 2020-09-03 06:21:57 +0000
Processing by FinishInstallationController#index as HTML
  Rendering finish_installation/index.html.erb within layouts/finish_installation
  Rendered finish_installation/index.html.erb within layouts/finish_installation (Duration: 3.2ms | Allocations: 356)
  Rendered layouts/_head.html.erb (Duration: 15.7ms | Allocations: 2969)
Completed 200 OK in 323ms (Views: 140.3ms | ActiveRecord: 0.0ms | Allocations: 32137)
Started GET "/finish-installation/register" for REDACTED-IP at 2020-09-03 06:22:01 +0000
Processing by FinishInstallationController#register as HTML
  Rendering finish_installation/register.html.erb within layouts/finish_installation
  Rendered finish_installation/register.html.erb within layouts/finish_installation (Duration: 7.1ms | Allocations: 1607)
  Rendered layouts/_head.html.erb (Duration: 22.3ms | Allocations: 3139)
Completed 200 OK in 107ms (Views: 41.3ms | ActiveRecord: 0.0ms | Allocations: 11760)
Started POST "/finish-installation/register" for REDACTED-IP at 2020-09-03 06:22:22 +0000
Processing by FinishInstallationController#register as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"l1hEEsK/gur5yplJdMIHttZAgYcuzLLkESaAI87IMb88nAFqNwi7l3yJ+3EJBw7leFypVGbH4C5hJl7VnJVYBQ==", "email"=>"someuser@protonmail.com", "username"=>"someusername", "password"=>"[FILTERED]", "commit"=>"Register"}
Redirected to https://discuss.mydomain.community/finish-installation/confirm-email
Completed 302 Found in 48ms (ActiveRecord: 0.0ms | Allocations: 4246)
  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 31)
Started GET "/finish-installation/confirm-email" for REDACTED-IP at 2020-09-03 06:22:22 +0000
Processing by FinishInstallationController#confirm_email as HTML
  Rendering finish_installation/confirm_email.html.erb within layouts/finish_installation
  Rendered finish_installation/confirm_email.html.erb within layouts/finish_installation (Duration: 2.3ms | Allocations: 418)
  Rendered layouts/_head.html.erb (Duration: 7.9ms | Allocations: 1612)
Completed 200 OK in 25ms (Views: 22.1ms | ActiveRecord: 0.0ms | Allocations: 4611)
Delivered mail ea8af868-4a2c-4312-85dd-f57061a3cd90@discuss.mydomain.community (60015.9ms)
Job exception: Net::ReadTimeout

Nach etwas Warten habe ich über den Browser „Benachrichtigungs-E-Mail erneut senden“ angefordert. Folgendes wurde nun zum Produktionsprotokoll hinzugefügt:

Delivered mail 47ca6f15-cd9e-4c96-a670-6646e2bda585@discuss.mydomain.community (60007.9ms)
Job exception: end of file reached

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 31)
Delivered mail 02367872-af3a-4df4-9a68-4e5e7c5eda60@discuss.mydomain.community (60007.4ms)
Job exception: end of file reached

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 31)
Delivered mail ee9ee1fc-6fd1-4970-89fa-260efe2dd04c@discuss.mydomain.community (60014.1ms)
Job exception: end of file reached

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.1ms | Allocations: 31)
Delivered mail 9030f87b-99df-4de2-9a60-2c57f7c752de@discuss.mydomain.community (60007.0ms)
Job exception: end of file reached

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 31)
Started PUT "/finish-installation/resend-email" for REDACTED-IP at 2020-09-03 06:31:22 +0000
Processing by FinishInstallationController#resend_email as HTML
  Parameters: {"authenticity_token"=>"NE21scxxyZz3/DxDkoF8kwi9GXoNKvnstNJdKZjQs7afigDKWcbw4XK/XnvvRHTApqExqUUghybE1oPfyo3aDA=="}
  Rendering finish_installation/resend_email.html.erb within layouts/finish_installation
  Rendered finish_installation/resend_email.html.erb within layouts/finish_installation (Duration: 0.9ms | Allocations: 163)
  Rendered layouts/_head.html.erb (Duration: 2.5ms | Allocations: 269)
Completed 200 OK in 63ms (Views: 6.5ms | ActiveRecord: 0.0ms | Allocations: 6408)
  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 31)
Delivered mail 127cc350-3fb0-4ef1-8759-391fb407b1cb@discuss.mydomain.community (60008.0ms)
Job exception: Net::ReadTimeout

Delivered mail d9c70dfd-5a8b-4f4c-bafa-5a540fc8ed4f@discuss.mydomain.community (60010.0ms)
Job exception: end of file reached

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.1ms | Allocations: 31)
Delivered mail e9e67ed1-d7b1-4e8a-ba11-30501c6fae89@discuss.mydomain.community (60012.4ms)
Job exception: end of file reached

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 31)
  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.1ms | Allocations: 31)
Delivered mail 82d0361e-0349-4a1a-928e-dcb16dcffdbc@discuss.mydomain.community (60008.6ms)
Job exception: end of file reached

Ich habe meinen Hosting-Anbieter kontaktiert, um zu prüfen, ob das Problem auf seiner Seite liegt. Er sagte, dass diese Konfiguration nach seinen Angaben problemlos funktionieren sollte, aber dass der VPS überhaupt keine Aktivität auf dem SMTP-Server verursacht hat.

Das ist also meine aktuelle Situation .. Beitrag an Meta.

Könnte es sein, dass der ausgehende Datenverkehr zum Mailserver blockiert wird? Können Sie von dort aus per Telnet verbinden? Vom Inneren des Containers?

Ja, ich kann erfolgreich über Telnet von innerhalb des Docker-Containers eine Verbindung zum SMTP-Server herstellen. Allerdings kann ich keine Test-E-Mail mit Telnet senden, da mein Anbieter dies nicht zulässt (die Verbindung wird geschlossen, sobald weitere Befehle gesendet werden).

Die Lösung erwies sich als einfach. Obwohl mein Anbieter den oben genannten Port angibt, habe ich Port 587 per Telnet getestet und festgestellt, dass er funktioniert. Also habe ich die app.yml geändert, einen Neuaufbau durchgeführt… und alles funktionierte einwandfrei :smiley:

Bevor ich das gesehen habe, wollte ich genau diese Änderung empfehlen.

Port 465 ist SMTP-over-SSL, was als veraltet gilt.
Port 587 ist der MSA-Port (Mail Submission Agent), auf dem typischerweise STARTTLS (Upgrade von einer Klartext- auf eine TLS-Verbindung) unterstützt wird.

Wenn Sie in der Konfiguration Port 465 verwendet haben, versuchte Discourse, eine Klartextverbindung zu einem SSL-Port herzustellen.

Vielen Dank, @supermathie, ich habe deine Antwort als Lösung markiert. Klare Erklärung.

Hallo @supermathie,

offenbar wurde Port 465 (oder wird gerade) nicht mehr als veraltet eingestuft, wie in RFC 8314 festgelegt. Mein aktueller E-Mail-Anbieter (mailfence.com) scheint dieser Empfehlung zu folgen.

Gibt es eine Möglichkeit, TLS bei der Verbindung mit Port 465 zu erzwingen? Das sollte hoffentlich mein Problem lösen, da ich mit swaks verifiziert habe, dass die Verwendung von STARTTLS (–tls) fehlschlägt, während die Verwendung von --tls-on-connect (–tlsc) innerhalb des Containers einwandfrei funktioniert:

swaks --to user@example.com --from myuser@mailfence.com --server smtp.mailfence.com:465 --auth LOGIN --tlsc --auth-user myuser@mailfence.com

Viele Grüße,

Ah, er wird nun für Submission über TLS wiederverwendet, das ist sinnvoll.

Derzeit nicht. Es sieht so aus, als würde ActionMailer das unterstützen, wenn du in smtp_settings :ssl = true setzt, aber wir haben momentan keinen Codepfad, um dies zu aktivieren.

Ich bin sicher, wir würden einen PR, der diese Unterstützung hinzufügt, gerne annehmen.