条件がすべて満たされているにもかかわらず、ユーザーにダイジェストメールが送信されない(Discourse 3.6)

Discourse 3.6 を使用しており、ダイジェストメールを受信するはずのユーザーの一部が受信できないという問題が発生しています。

影響を受けているユーザーについて確認したことは以下のとおりです。

  • enable_digest_emails が true である
  • ユーザーがダイジェストをトリガーするのに十分な期間非アクティブであった
  • メールアドレスが有効で確認済みである
  • メールプロバイダーからのバウンスや抑制がない
  • その他のメール(通知など)は正常に送信される
  • 管理画面 → メール → 送信済みログにダイジェストメールが表示されない
  • 管理画面 → メール → ダイジェストテストを使用すると、システムは正しく「はい、ダイジェストが送信されるはずです」と表示されますが、実際には何も送信されず、ログにも記録されません。

Sidekiq または本番ログに関連するエラーは表示されません。

管理画面 UI のすべての設定と適格性チェックで、ユーザーが受信するはずであることを示しているにもかかわらず、3.6 でダイジェストメールがサイレントに失敗するのを見たことがある人はいますか?

「いいね!」 2

ユーザーの設定を、環境設定のメールタブで確認しましたか?

はい、これが彼らの設定であり、送信されるべきであることを示すダイジェストレンダリングです。

更新 / 再現手順 (Discourse 3.6)

Rails コンソールを使用して明示的な再現を実行し、ジョブ レベルで何が起こっているかを確認しました。影響を受けたユーザーについては、次のことがわかります。

サイト: hvac

現在: 2025-10-15 17:23:01 UTC

disable_emails: “no”

disable_digest_emails: false

default_email_digest_frequency_minutes: 10080

ENV_DISABLE_EMAILS: nil

perform_deliveries: nil

smtp_address: “smtp.netcorecloud.net

smtp_port: 587

– ユーザー –

id: 42122

username: milnerlarry

active: true

suspended: false

email_digests: true

digest_after_minutes: 10080

eligible_by_time: true

– 最後の 15 件のメールログ –

2025-10-01 | type=digest | bounced=false

2025-09-22 | type=digest | bounced=false

perform_deliveries_now: true

次に、ダイジェストを手動で強制ビルドすると、Discourse はビルドしていると考えていますが、次の結果が返されます。

mail = UserNotifications.digest(u)

=> ビルドされたダイジェストメール: subject=nil bytes=50

したがって、Discourse はダイジェストをビルドしていると考えていますが、実際には空 (subject=nil) であり、ジョブが実行されるときにサイレントにスキップされます。EmailLog エントリは作成されず、何も送信されません。

これにより、次のことが確認されます。

  • ジョブは正常にエンキューされます
  • SMTP と配信が有効になっています
  • メーラーが空のダイジェストを返すため、ダイジェスト ジョブはエラーなしで終了します

次の方法でジョブをインラインで実行します。

Jobs::UserEmail.new.execute(“type” => “digest”, “user_id” => u.id”)

新しい EmailLog 行が作成されないという同じ結果が得られます。

考えられる原因:

ダイジェストは「空のダイジェスト」条件によりスキップされているようです。Discourse 3.6 が含めるコンテンツを評価する方法が変更された可能性があります。管理者 → メール → ダイジェスト テストビューはダイジェストを正しくレンダリングしますが、バックグラウンド ジョブには含めるものが何も表示されません。

要約:

:white_check_mark: 対象ユーザー

:white_check_mark: アクティブなメール + 有効な SMTP

:white_check_mark: 管理者ダイジェスト テストは正しくレンダリングされます

:prohibited: バックグラウンド ダイジェスト ジョブはサイレントにスキップされます (空のダイジェスト)

:prohibited: EmailLog または送信試行は記録されません

チームからの確認をお願いします。UserNotifications.digest が 3.6 でコンテンツを収集する方法にリグレッションがある可能性はありますか?

さらに作業を進めたところ、4,000人のユーザーのうち、アクティビティの概要を確実に受信できているユーザーが少数いることがわかりました。

概要を受信できているユーザーと受信できていないユーザーを比較しても、設定に違いは見られませんでした。

===== xxxxx (ID: 4149) =====
アクティブ: true, サスペンド: false, サイレンス: false
メール確認済み: false
ダイジェスト有効: true
ダイジェスト頻度: 10080 分
最終ログイン: 2025-03-24 20:58:55 UTC
最終メール送信: 2025-10-16 17:07:53 UTC
ミュートされたカテゴリ:
ユーザー統計ダイジェスト試行: 2025-10-16 17:07:53 UTC
送信済みメール総数:16
===== xxxxxxx (ID: 42206) =====
アクティブ: true, サスペンド: false, サイレンス: false
メール確認済み: false
ダイジェスト有効: true
ダイジェスト頻度: 10080 分
最終ログイン: 2025-09-14 15:52:54 UTC
最終メール送信: 2025-10-01 23:30:33 UTC
ミュートされたカテゴリ:
ユーザー統計ダイジェスト試行: 2025-10-16 17:32:34 UTC
送信済みメール総数:2

もちろん、他にも設定はありますが、いずれにしても興味深い比較でした。

Rails コマンドで、本当に期限切れになっているダイジェスト/アクティビティ サマリーの数をチェックする方法を教えていただけますか?基本的に、システムが設計どおりにサマリーを送信しているかどうかのヘルス チェックです。

アクティブユーザーで、メールダイジェストが有効になっており、次のダイジェストメールの送信時期が来ているユーザーは、以下のレールコンソールクエリで試すことができます。

User.joins(:user_option)
  .where("user_options.email_digests = ?", true)
  .where("users.suspended_at IS NULL")
  .where("COALESCE(users.last_emailed_at, users.created_at) < (NOW() - INTERVAL '1 minute' * user_options.digest_after_minutes)")
  .count

要約がスキップされるのは、ユーザーが「Suppress digest email after days」を訪問しなかったためでしょうか?

@jahan_gagan、それは役立ちますが、ダイジェスト/アクティビティサマリーを受け取るユーザーはわかりますが、アクティビティサマリーを受け取らなかったユーザーはわかりません。意味は通じますか?問題は、受け取るべきダイジェストを受け取っていないユーザーをどのように確認するかということです。

@Moin、0に設定されており、これは要因とならないはずです。

0で無効になるというのは本当ですか?代わりに大きな数を試しましたか?

@Moin ありがとうございます。3000に変更しましたが、送信されるダイジェストに変更はありません。週次の頻度(現在2週間以上)で送信されていないものが数百件見られます。

現在、誰が対象となるかを確認するためのテストです。

今から強制送信を試みますが、何も送信されません…

ダイジェストを受け取っていないサンプルユーザーを対象に、管理インターフェイスを確認したところ、完全に適格であるように見えます…

他に良いアイデアがなかったので、管理画面から全ユーザーのダイジェスト頻度を1440(1日)に変更しました。

すると突然、すべてのダイジェストが送信されました…

なぜこうなったのか、どなたか心当たりはありますか?頻度を変更しても、週次頻度で対象となっていたユーザーが見えているので、影響はないはずなのですが。

早とちりでした。周波数の変更は、あるグループ(1つのサイト)のユーザーには機能しましたが、別のグループには全く効果がありませんでした。謎は続きます…

上記でリンクしたクエリの最後の要件の1つが原因だと思います。

ユーザーが実在し、アクティブで、ステージングされておらず、一時停止されておらず、ダイジェストを無効にしていないこと、および頻度が0より大きいことを確認した後、プライマリメールがあり、バウンススコアが正常であることを確認した後、時間ベースのチェックがあります。

最終ログインdigest_after_minutesより前であった
最終ログインsuppress_digest_email_after_days以内であった
ユーザーがダイジェストを受信すべきかどうかの最後のチェックがdigest_after_minutes前であった

最後のものが原因だと思います。Discourseが昨日ダイジェストを送信しようとして、digest_after_minutesが1週間だった場合、1週間経過するまで再度試行しません。それを減らすと、次の試行がより早く行われます。

「いいね!」 1

@Jacob_Peebles はかなり長い間この問題で苦労しているようですね! Digest Emails Not Sending to All Users – Need Help Debugging の3月の投稿も同じ問題についてではないかと思いますが、合っていますか?

Moin の最新の投稿は役に立ちましたか?もしそうであれば、お知らせください。このトピックを締めくくりたいと思います。