SMTP-Mails werden nicht gesendet und die Verbindung schlägt fehl, aber openssl funktioniert

Hallo! Es tut mir leid, falls es für dieses Problem bereits eine klare Lösung gibt; ich habe mich wirklich umgesehen und keine klare Lösung für mein Problem gefunden.

Ich habe also eine Discord-Instanz selbst gehostet und nach einigem Herumbasteln die richtige Konfiguration für SMTP erhalten, aber E-Mails an neue Benutzer werden nicht gesendet (nicht einmal an den anfänglichen Admin-Benutzer; ich habe schließlich einen mit dem Rake-Befehl im Container erstellt).

Zuerst dachte ich, ich könnte mich aufgrund von DNS-Problemen nicht mit dem SMTP verbinden, da bei der Arbeit mit ./discourse-doctor und dem anschließenden Aufrufen der Container-Shell Folgendes zurückgegeben wird:

Testing sending to xxxx@gmail.com using smtp-relay.brevo.com:587, username:xxxxxxx@smtp-brevo.com with plain auth.
======================================== ERROR ========================================
Connection to port 587 failed.
====================================== SOLUTION =======================================
The most likely problem is that your server has outgoing SMTP traffic blocked.
If you are using a service like Mailgun or Sendgrid, try using port 2525.
=======================================================================================

Der im SMTP-Fehlerbehebungsleitfaden empfohlene openssl-Befehl stellte jedoch nicht nur eine Verbindung her, sondern ich konnte auch mit EHLO, AUTH LOGIN und all diesen Befehlen (von denen ich bis jetzt nicht wusste, dass sie existieren, heh ^^') eine Test-E-Mail von innerhalb des Containers an mich selbst senden. Ich glaube also nicht, dass das Problem darin besteht, dass der Container keine Verbindung zum SMTP-Server herstellen kann.

EDIT ZUR KLARSTELLUNG
Ich konnte dies innerhalb des Containers tun: Ich habe mich mit dem Befehl ./launcher enter container in den Container eingeloggt. Von dieser Eingabeaufforderung aus habe ich die obigen Befehle ausgeführt.

Hier sind meine SMTP-Einstellungen, falls es hilft. Die Anmeldeinformationen habe ich natürlich geschwärzt.

  DISCOURSE_SMTP_ADDRESS: 'smtp-relay.brevo.com'
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: 'xxxxxxxx@smtp-brevo.com'
  DISCOURSE_SMTP_PASSWORD: 'xxxxxxxxxxxx'
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, standardmäßig true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (von einigen Anbietern erforderlich)
  DISCOURSE_NOTIFICATION_EMAIL: 'noreply@mydomain.xyz'    # (Adresse, von der Benachrichtigungen gesendet werden)
  #DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none

Die Benachrichtigungs-E-Mail war diejenige, die ich über den openssl-Befehl getestet habe, und die letzte Zeile habe ich irgendwo in einem anderen Beitrag gelesen und hinzugefügt, aber auskommentiert und nie ausprobiert, da es ein alter Beitrag war.

Ich bin hier wirklich ratlos, ich hoffe, jemand kann mir helfen, und es tut mir wirklich leid, wenn dies ein gelöstes Problem war, das ich nicht gefunden habe!

Könnten Sie versuchen, was der Fehler vorschlägt, um zu sehen, ob es zufällig funktioniert?

2 „Gefällt mir“

Hallo! Ich habe das bereits versucht, es hat nicht funktioniert :frowning:

Ich konnte zwar eine Test-E-Mail mit OpenSSL senden, aber über Port 587. Aber über die Discourse-Oberfläche (sowohl über den Test-E-Mail-Button in der GUI als auch über den Befehl rake tests:email[mail]) konnte ich das nicht tun, sowohl über Port 287 als auch über 2525.

Apropos, ich habe den Sidekiq-Fehler für die nicht gesendete E-Mail gefunden:

Jobs::HandledExceptionWrapper: Wrapped Net::OpenTimeout: execution expired

Die relevanten Zeilen in shared/standalone/log/rails/production.log wurden gefunden:

Started POST "/admin/email/test" for 192.168.0.206 at 2024-10-18 23:49:02 +0000
Processing by Admin::EmailController#test as */*
  Parameters: {"email_address"=>"jggalindez@gmail.com"}
Completed 422 Unprocessable Entity in 5201ms (Views: 0.4ms | ActiveRecord: 0.0ms | Allocations: 12487)

Können Sie Port 587 aus dem Container heraus erreichen?

Es klingt, als könnten Sie Port 587 vom Host aus erreichen, aber möglicherweise nicht aus dem Container heraus, was ein Netzwerkproblem auf Ihrem Server bedeuten würde.

2 „Gefällt mir“

Hallo! Entschuldigung, ich war etwas unklar. Ich konnte eine Verbindung zu Port 587 herstellen innerhalb des Containers, zumindest nach meinem Verständnis, da ich Folgendes getan habe:

  • Ich habe mich mit ./launcher enter containername in den Container eingeloggt.
  • Innerhalb des Containers habe ich den openssl-Befehl ausgeführt.
  • Innerhalb der Pseudo-Telnet-Eingabeaufforderung (ich bin mir nicht sicher, was das eigentlich ist) habe ich mich beim SMTP-Server authentifiziert (indem ich den Benutzernamen und das Passwort in Base64 umgewandelt habe) und eine E-Mail gesendet.

Ich habe jedoch nicht versucht, eine E-Mail vom Server aus zu senden. Nur vom Container aus (soweit ich das verstehe), aber ich dachte, wenn es vom Container aus möglich ist, dann auch vom Server aus.

Es funktioniert also. Es scheint, dass es doch ein DNS-Problem war (weil die URL mit den Befehlen getent und openssl aufgelöst werden konnte). Ich habe also getent verwendet, um die Host-IP des SMTP-Relais zu ermitteln, und den Container mit der Serveradresse als rohe IP-Adresse gestartet. Das führte zu einem anderen Fehler, dem in diesem Thread. Die dort genannte Lösung, die Zeile DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none zur yaml-Datei hinzuzufügen, hat es schließlich zum Laufen gebracht.

Ich weiß nicht wirklich, ob das DNS-Problem in Zukunft Probleme verursachen wird, hoffe es nicht, lol, aber danke euch beiden für eure Hilfe!

1 „Gefällt mir“

Sie haben also doch ein Netzwerkproblem im Container, das aber von DNS und nicht von der IP-Konnektivität herrührt.

Können Sie sich mit openssl s_client vom Container aus mit dem Hostnamen verbinden?

Sie sollten Folgendes ausführen können:

openssl s_client -connect smtp-relay.brevo.com:587 -starttls smtp

und erhalten:

…
Verify return code: 0 (ok)
…

Das ist zu erwarten, da Sie sich mit einer IP-Adresse verbinden und diese IP-Adresse nicht auf dem Zertifikat steht.

Das wird es.

1 „Gefällt mir“

Ja, das habe ich mir gedacht, also habe ich den docker_args YAML-Tag zur Konfigurationsdatei hinzugefügt und einige DNS-Server direkt angegeben.

Für alle, die sich fragen (ich musste nachschauen, wo der docker_args-Tag hingehört), hier ist ein Teil der app.yml-Datei:

*******Omitted lines above*********
## SEIEN SIE *SEHR* VORSICHTIG BEIM BEARBEITEN!
## YAML-DATEIEN SIND SEHR, SEHR EMPFINDLICH GEGENÜBER FEHLERN BEI LEERZEICHEN ODER AUSRICHTUNG!
## Besuchen Sie http://www.yamllint.com/, um diese Datei bei Bedarf zu validieren

docker_args: "--dns 1.1.1.1 --dns 8.8.4.4 --dns 8.8.8.8"

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Kommentar entfernen, um den IPv6-Listener zu aktivieren
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
*******Omitted rest of file below*********

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.