Discourse doctor が SMTP 認証情報を解析できない (+ 管理者登録メールも機能しない)

さて、まず初めに、これは本番環境です。最初の登録メールが送信されません。

SMTP 設定は正しいと確信しています。
使用しているポートでメールサーバーに ping や telnet は通りますが、「EHLO mailserver」と入力すると、すぐに外部ホストから接続が切断されてしまいます。

ログの末尾には以下のように表示されています:

  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

SMTP 設定が正しいか確認するため /var/discourse/discourse-doctor を実行しましたが、設定を検証できませんでした。以下のようなメッセージが表示されます:

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

しかし、私の YAML ファイル(./containers/app.yml)は完全に正しい形式に見えます。

  ## TODO: The SMTP mail server used to validate new accounts and send notifications
  # SMTP ADDRESS, username, and password are required
  # WARNING the char '#' in SMTP password can cause problems!
  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           # (optional, default true)

  ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
  LETSENCRYPT_ACCOUNT_EMAIL: redacted@redacted.com

それは解決すべき問題のようです。あなたが説明したネットワークエラーと一致しています。

推測すると、パスワードに含まれる特殊文字が Discourse-doctor を混乱させているのでしょう。

このアドレスは SMTP アドレスのようには見えません。
おそらくこの「mail.redacted.com」は HTTP アドレスだと思います。
確認されることをお勧めします。

@irwinstar、公開フォーラムで私のメールサーバーを晒さないよう、実際のメールサーバー名は伏せました。しかし、これは間違いありません。動作している私のメールクライアントの設定をそのままコピーし、さらに実際のメールサーバーの SMTP 設定とも照合したからです。

ご支援のお申し出、ありがとうございます。問題は SPF/DKIM レコードにあると思われるので、それを修正しようとしています。

それとは別に、discourse-doctor は正しくパースするはずです。自分で vim/nano でファイルを編集した覚えはないので、何が起きているのか分かりません。念のため申し上げますと、この YAML は discourse-setup を使って生成されたものです。

Discourse は現在、465 番ポートのプロトコルをサポートしていないと思います。メールサーバーが 587 番ポートをサポートしている場合は、代わりに 587 に変更してください。
残念ながら、私のメールサーバーは 587 を使用できないため、Discourse の外部にメールプロキシを追加しました。

@irwinstar、もしこれが正しいなら、これは非常に重要な情報であり、私のメール設定が機能していない理由を説明する可能性があります。この情報の出典はありますか?

詳しくはわかりませんが、465 番ポートを何度か試しました。
最終的に、メールプロキシとして「hieulq/mailproxy」という Docker イメージを使用し、Discourse 用の app.yml に以下の設定を適用しました。
この使い方はあまり良くないかもしれませんが、動作します。
今日、メール関連のプラグインを探してみましたが、見つかりませんでした。

  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

@simbleau さん、こんにちは

私の経験では、SendGrid は(ポート 587 で)よく機能します。

また、SendGrid を無料でテストすることも可能です!

ご提案ありがとうございます。

すでに HostGator にメールサーバーを保有しているため、クラウドメールサーバーの購入やプロキシの使用(もし汚い解決策を望むなら、この時点で管理者アカウントを悪用するところでした)は避けたいと考えています。

Discourse サーバーの IP に対する SPF レコードは設定済みだと確信しています。現在は DKIM レコードの検証に集中しています。

465 が許可されていないことを確認できれば、それは素晴らしいニュースです。そうすれば、問題のないことに対して深入りするのを防げます。 465 は問題でした。以下の投稿で確認済みです。

インストールについて少し進捗がありました。

ポート 587 を使用して、メール全体を正常に telnet で接続し、認証も問題なく行えました。そのため、設定を変更しました。

現在、メールが送信される際に以下のエラーが発生しています:

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

ただし、以前は接続が 60 秒間タイムアウトしていたのに対し、今回は 250ms で異なる例外が発生していることに気づきました。

おそらく、system@discourse.redacted.com というメールを使用しているためですが、このメールは内部的に mail.redacted.com をメールサーバーとして使用していることが原因ではないでしょうか。

正直なところ、どう解決すればよいかわかりません。以下を試してみました:

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

その後、再構築を行って一時的にこの設定を使用しようとしましたが、効果はありませんでした。同じエラーが発生します。

メールの問題を解決しました!(discourse-doctor はまだ正しく解析されていません)

Ruby とこのエラーが裏側で発生していた理由についてさらに調査したところ、この Stack Overflow の質問にたどり着きました。

これが原因でした。解決策には SSL negotiation の変更が含まれており、それによって app.yml ファイルでこの設定をオフにするというアイデアが浮かびました。
DISCOURSE_SMTP_ENABLE_START_TLS: false # (オプション、デフォルトは true)

その後、成功しました!

これにより TLS 暗号化は無効化されますが、問題の本質はホスト名が正しくないことにあります。つまり、メールサーバーが提示する証明書に記載されている名前が mail.redacted.com と異なるのです。多くのメールサーバーは複数の異なるホスト名で知られており、証明書に使用されているホスト名を特定する必要があります。

サーバーが自身の何と名乗っているかを確認し、それに応じて設定を調整してみてください。

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

それでもうまくいかない場合は、TLS 暗号化を有効にしたまま、証明書検証のみを無効にすることもできます。

DISCOURSE_SMTP_ENABLE_START_TLS: true
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: false

@RGJ さん、ありがとうございます!奇妙なことに、CN がメールとは無関係な私のサブドメインのいずれかだと表示されています。調査の価値がありそうです。ご助言をありがとうございます。

すべてのユーザーが同じ情報を持っています。

もしよろしければ、プライベートで app.yml を共有していただければ、discourse-doctor が混乱している原因を特定できるかもしれません。

送信しました。ぜひ挑戦してみてください。

ああ、問題なのは、GNU awk 以外のバージョンの awk をお持ちで、--field-separator オプションがお使いの awk では別の名称になっていることです。

お使いの awk のバージョンは何ですか?また、実行している OS は何ですか?

man awkVersion 1.3.4 2019-12-31 MAWK(1) と表示します。

cat /etc/os-release は以下を表示します:

~$ 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

discourse-doctor を編集して、--field-separator-F に置き換えてみてください。

これで問題が解決するようです。確認していただければ、PR を提出します。

部分的に機能しました。エラーは消えましたが、何も返さなくなりました。

==================== YML 設定 ====================
DISCOURSE_HOSTNAME=
SMTP_ADDRESS=
DEVELOPER_EMAILS=
SMTP_PASSWORD=
SMTP_PORT=
SMTP_USER_NAME=
LETSENCRYPT_ACCOUNT_EMAIL=

解決しました。

discourse-doctor の 213 行目を以下に変更してください。

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

これは、mawk が -F=\":\" を嫌うためです。代わりに、-F ":" のようにスペースを必須とする仕様になっています。:roll_eyes:

PR を作成しました: Changed awk config command to be more cross platform by nuzzles · Pull Request #513 · discourse/discourse_docker · GitHub