Il parser del medico di Discourse non funziona con le credenziali SMTP (+ l'email di registrazione dell'amministratore non funziona)

Beh, per iniziare, questa è la produzione e non riesco a inviare il primo email di registrazione.

Sono certo che le mie impostazioni SMTP siano corrette.
Riesco a fare ping e telnet al mio server di posta con la porta utilizzata, ma non appena eseguo “EHLO mailserver”, la connessione viene chiusa dall’host remoto.

Alla fine dei miei log, viene indicato:

  Rendering layouts/email_template.html.erb
  Rendered layouts/email_template.html.erb (Duration: 0.2ms | Allocations: 32)
Delivered mail f3853b94-b772-48c2-b1b7-a78bbcbfc5c1@discourse.mywebsite.com (60177.6ms)
Job exception: Net::ReadTimeout

Ho anche verificato che le mie impostazioni SMTP fossero corrette eseguendo /var/discourse/discourse-doctor, ma non riesce a convalidarle. Dice:

==================== YML SETTINGS ====================
awk: not an option: --field-separator=:
DISCOURSE_HOSTNAME=
awk: not an option: --field-separator=:
SMTP_ADDRESS=
awk: not an option: --field-separator=:
DEVELOPER_EMAILS=
awk: not an option: --field-separator=:
SMTP_PASSWORD=
awk: not an option: --field-separator=:
SMTP_PORT=
awk: not an option: --field-separator=:
SMTP_USER_NAME=
awk: not an option: --field-separator=:
LETSENCRYPT_ACCOUNT_EMAIL=

Ma il mio YAML (./containers/app.yml) sembra essere formattato perfettamente.

  ## TODO: Il server di posta SMTP utilizzato per convalidare i nuovi account e inviare notifiche
  # Sono richiesti l'indirizzo SMTP, il nome utente e la password
  # ATTENZIONE: il carattere '#' nella password SMTP può causare problemi!
  DISCOURSE_SMTP_ADDRESS: mail.redacted.com
  DISCOURSE_SMTP_PORT: 465
  DISCOURSE_SMTP_USER_NAME: redacted@redacted.com
  DISCOURSE_SMTP_PASSWORD: "redacted"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opzionale, valore predefinito true)

  ## Se hai aggiunto il template di Lets Encrypt, decommenta qui sotto per ottenere un certificato SSL gratuito
  LETSENCRYPT_ACCOUNT_EMAIL: redacted@redacted.com

Sembra qualcosa che va risolto. È coerente con l’errore di rete che hai descritto.

Il mio sospetto è che i caratteri speciali nella tua password stiano creando confusione a Discourse-doctor.

Questo indirizzo non sembra essere un indirizzo SMTP.
Immagino che “mail.redacted.com” sia l’indirizzo HTTP.
Credo che tu debba controllarlo.

@irwinstar, ho rimosso il server di posta reale per evitare di esporlo su un forum pubblico. Posso però garantire che è corretto, poiché ho copiato le impostazioni dal mio client di posta (che funziona) e le ho confrontate con le impostazioni SMTP del mio server di posta reale.

Grazie per la tua offerta di aiuto. Penso che il problema risieda nei record SPF/DKIM, quindi sto cercando di risolverli.

Tuttavia, discourse-doctor dovrebbe comunque analizzarlo correttamente. Non sono sicuro di cosa stia succedendo, dato che non ho modificato io stesso il file in vim/nano. Per chiarezza, il file YAML è stato generato utilizzando discourse-setup.

E penso che Discourse non supporti attualmente il protocollo sulla porta 465. Se il tuo server di posta supporta la porta 587, puoi modificarla in 587.
Purtroppo, il mio server di posta non può utilizzare la porta 587, quindi ho aggiunto un proxy di posta esterno a Discourse.

@irwinstar, se queste informazioni sono corrette, sono estremamente importanti e spiegherebbero perché la mia configurazione della posta non funziona. Hai una fonte per queste informazioni?

Non ne sono sicuro, ma ho provato più volte la porta 465.
Infine, ho utilizzato l’immagine Docker “hieulq/mailproxy” come proxy di posta.
E ho usato questa configurazione app.yml per Discourse.
Questo utilizzo sembra scorretto, ma funziona.
Ho cercato un plugin per la posta oggi, ma non ne ho trovato nessuno.

  DISCOURSE_SMTP_ADDRESS: x.x.x.x
  DISCOURSE_SMTP_PORT: 2525
  DISCOURSE_SMTP_AUTHENTICATION: none
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
  DISCOURSE_SMTP_ENABLE_START_TLS: false

Ciao @simbleau

La mia esperienza è che SendGrid funziona bene (porta 587).

Puoi anche provare SendGrid gratuitamente!

Apprezzo i suggerimenti.

Sto cercando di evitare l’acquisto di server di posta cloud o l’uso di proxy (perché se volessi una soluzione poco elegante, a questo punto mi limiterei a prendere un account amministratore), dato che ho già un server di posta su HostGator.

Sono certo che i record SPF siano impostati per l’IP del mio server Discourse. Sto cercando principalmente di validare i record DKIM.

Se qualcuno può confermare che la porta 465 non è consentita, sarebbe una notizia fantastica, perché mi risparmierebbe di scendere troppo in profondità in un problema inesistente. La porta 465 era un problema, come indicato nel post sottostante.

Ho fatto qualche progresso sull’installazione.

Usando la porta 587 riesco a fare telnet con successo per un’intera email e l’autenticazione funziona. Quindi ho fatto il cambio.

Ora, quando l’email viene inviata, ricevo il seguente errore:

Delivered mail d86b48cc-b0f4-4df3-8960-ab5ff96613a0@discourse.imbleau.com (251.0ms)
Job exception: hostname "mail.redacted.com" does not match the server certificate

Tuttavia, ho notato che questo non è più un timeout di connessione (attivato dopo 60 secondi interi), ma piuttosto un’eccezione diversa ricevuta in 250 ms.

Questo è probabilmente perché ho usato un’email come system@discourse.redacted.com, ma questa email utilizza internamente mail.redacted.com come server di posta.

Onestamente, non sono sicuro di come risolvere il problema. Ho provato quanto segue:

./launcher enter app
rails r "SiteSetting.notification_email = 'system@mail.redacted.com'"
exit

e ho ricostruito, per usarlo solo questa volta. Ancora senza successo. Lo stesso errore.

PROBLEMA DELLA EMAIL RISOLTO! (discourse-doctor analizza ancora in modo errato)

Ho fatto qualche ricerca su Ruby e sul motivo per cui si verificava questo errore, il che mi ha portato a questo thread su Stack Overflow.

Questo era il colpevole. La soluzione consisteva nel modificare la negoziazione SSL, il che mi ha dato l’idea di disattivare questa impostazione nel file app.yml:
DISCOURSE_SMTP_ENABLE_START_TLS: false # (opzionale, valore predefinito true)

Dopo di ciò, SUCCESSO!

Questo disabiliterà la crittografia TLS, mentre l’unico problema è che stai utilizzando un nome host errato, ovvero il server di posta sta presentando un certificato che indica qualcosa di diverso da mail.redacted.com. Molti server di posta tendono ad essere conosciuti con diversi nomi host; devi solo scoprire quale sta utilizzando per il suo certificato.

Potresti provare a scoprire quale nome host dichiara di essere e adattare di conseguenza la tua configurazione.

echo | openssl s_client -connect mail.redacted.com:587 -starttls smtp -servername mail.redacted.com 2>/dev/null |openssl x509 -noout -subject

Se ciò non funziona, puoi lasciare la crittografia TLS abilitata e DISABILITARE SOLO la verifica del certificato:

DISCOURSE_SMTP_ENABLE_START_TLS: true
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: false

Grazie @RGJ! Stranamente, dice che il CN è uno dei miei sottodomini, completamente estraneo alla posta. Vale la pena indagare. Grazie per la guida.

Tutti i tuoi utenti avranno le stesse informazioni.

Se mi condividerai privatamente il tuo app.yml, cercherò di capire cosa sta confondendo discourse-doctor.

Inviato. Dai una prova.

Ah. Il problema è che hai una versione di awk diversa da GNU awk e l’opzione --field-separator ha un nome diverso nella tua versione di awk.

Quale versione di awk hai? Quale sistema operativo stai utilizzando?

man awk mi indica Version 1.3.4 2019-12-31 MAWK(1)

cat /etc/os-release mi mostra:

~$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

Potresti provare a modificare discourse-doctor e sostituire --field-separator con -F?

Sembra che questo risolverà il problema. Se puoi confermare, invierò una PR.

Ha funzionato parzialmente. L’errore è scomparso, ma non restituisce più nulla.

==================== IMPOSTAZIONI YML ====================
DISCOURSE_HOSTNAME=
SMTP_ADDRESS=
DEVELOPER_EMAILS=
SMTP_PASSWORD=
SMTP_PORT=
SMTP_USER_NAME=
LETSENCRYPT_ACCOUNT_EMAIL=

L’ho risolto.

In discourse-doctor, modifica la riga 213 come segue:

  read_config_result=$(echo $config_line | awk  -F ":" '{print $2}')

Funziona perché mawk odia -F=":", invece richiede letteralmente uno spazio, come -F ":". :roll_eyes:

Ho aperto una PR: Changed awk config command to be more cross platform by nuzzles · Pull Request #513 · discourse/discourse_docker · GitHub