Le email SMTP non vengono inviate e la connessione fallisce, ma openssl funziona

Ciao! Mi dispiace se questo problema ha già una soluzione chiara; ho cercato molto e non ho trovato una soluzione chiara al mio problema.

Quindi, ho auto-ospitato un’istanza di Discord e dopo qualche aggiustamento ho ottenuto la configurazione corretta per SMTP, ma le email ai nuovi utenti non vengono inviate (nemmeno all’utente amministratore iniziale; ho finito per crearne uno con il comando rake all’interno del container).

All’inizio pensavo che non sarei stato in grado di connettermi a SMTP a causa di alcuni problemi DNS, poiché quando ho armeggiato con ./discourse-doctor e infine sono entrato nella shell del container, restituisce:

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.
=======================================================================================

Tuttavia, il comando openssl raccomandato nella guida alla risoluzione dei problemi SMTP non solo si è connesso, ma sono stato in grado, con EHLO, AUTH LOGIN e tutti quei comandi (che non sapevo esistessero fino ad ora, eh ^^') di inviare un’email di prova a me stesso dal container stesso. Quindi non penso che il problema sia che il container sia incapace di connettersi al server SMTP.

EDIT PER CHIAREZZA
Sono stato in grado di farlo dall’interno del container: ho effettuato l’accesso al container usando il comando ./launcher enter container. Da quel prompt ho eseguito i comandi precedenti.

Ecco le mie impostazioni SMTP, se può aiutare. Ho omesso le informazioni di accesso, ovviamente.

  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, default true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (required by some providers)
  DISCOURSE_NOTIFICATION_EMAIL: 'noreply@mydomain.xyz'    # (address to send notifications from)
  #DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none

L’email di notifica era quella che ho testato tramite il comando openssl, e l’ultima riga l’ho letta da qualche parte in un altro post e l’ho aggiunta, ma l’ho commentata e non l’ho mai provata perché era un post vecchio.

Comunque, sono davvero perso qui, spero che qualcuno possa darmi una mano, e mi dispiace davvero se questo era un problema risolto che non ho trovato!

Potresti provare quello che suggerisce l’errore, per vedere se funziona per caso?

2 Mi Piace

Ciao! Ho già provato, non ha funzionato :frowning:

Sono riuscito a inviare un’email di prova con openssl, ma tramite la porta 587. Tuttavia, tramite l’interfaccia di Discourse (sia tramite il pulsante di test dell’email nell’interfaccia grafica che tramite il comando rake tests:email[mail]) non sono riuscito a farlo, sia tramite la porta 287 che 2525.

A parte questo, ho trovato l’errore di Sidekiq per l’email non inviata:

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

Trovate le righe pertinenti in shared/standalone/log/rails/production.log:

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)

Sei in grado di connetterti alla porta 587 dall’interno del container?

Sembra che tu possa connetterti alla porta 587 dall’host, ma potresti non essere in grado di farlo dall’interno del container, il che significherebbe un problema di rete sul tuo server.

2 Mi Piace

Ciao! Scusa, sono stato un po’ poco chiaro. Sono riuscito a connettermi alla porta 587 dall’interno del container, almeno per quanto ne so, facendo quanto segue:

  • Ho effettuato l’accesso al container usando ./launcher enter nomecontainer.
  • Dall’interno del container, ho eseguito il comando openssl.
  • Dal prompt pseudo telnet (non sono sicuro di cosa sia in realtà), mi sono autenticato con il server SMTP (facendo tutta la conversione di nome utente e password in base64) e ho inviato un’e-mail.

In realtà non ho provato a inviare un’e-mail dal server, però. Solo dall’interno del container (per quanto ne capisco), ma ho pensato che se fosse stato in grado di farlo dall’interno del container, sarebbe stato dal server.

Quindi, sono riuscito a farlo funzionare. Sembra che fosse un problema con il DNS, in qualche modo (perché era in grado di risolvere l’URL quando usava i comandi getent e openssl). Quindi ho eseguito getent per ottenere l’IP host del relay SMTP e ho eseguito il container cambiando l’indirizzo del server all’IP grezzo. Questo mi ha portato a un errore diverso, quello in questo thread. La soluzione indicata lì, per aggiungere la riga DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none al file yaml, alla fine l’ha fatto funzionare.

Non so davvero se il problema del DNS causerà problemi in futuro, spero di no lol, ma grazie a entrambi per il vostro aiuto!

1 Mi Piace

Quindi stai avendo un problema di rete nel container, ma deriva dal DNS e non dalla connettività IP.

Riesci a connetterti usando openssl s_client all’hostname dall’interno del container?

Dovresti essere in grado di eseguire:

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

e ottenere:

…
Verify return code: 0 (ok)
…

È previsto poiché ti stai connettendo a un indirizzo IP e quell’indirizzo IP non sarà sul certificato.

Lo farà.

1 Mi Piace

Sì, l’avevo immaginato, quindi ho finito per aggiungere il tag docker_args nel file di configurazione e specificare alcuni server DNS direttamente.

Per chiunque si stesse chiedendo (ho dovuto cercare dove andasse il tag docker_args), ecco una parte del file app.yml:

*******Linee omesse sopra*********
## FAI *MOLTA* ATTENZIONE QUANDO MODIFICHI!
## I FILE YAML SONO ESTREMAMENTE SENSIBILI A ERRORI DI SPAZIATURA O ALLINEAMENTO!
## visita http://www.yamllint.com/ per convalidare questo file se necessario

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"
  ## Decommenta la riga successiva per abilitare l'ascoltatore IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
*******Resto del file omesso sotto*********

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