サスペンションメールが「undefined method 'topic'」で失敗し、他のメールは正常に動作します

3.1.0.beta3

ユーザーが一時停止された場合、そのユーザーにメールが送信されず、以下のエラーがログに記録されます。他のすべてのメールは正常に配信されます。

Job exception: undefined method 'topic' for nil:NilClass

バックトレース

/var/www/discourse/app/jobs/regular/user_email.rb:116:in `message_for_email' 
/var/www/discourse/app/jobs/regular/user_email.rb:76:in `send_user_email' 
/var/www/discourse/app/jobs/regular/user_email.rb:39:in `execute' 
/var/www/discourse/plugins/chat/lib/chat/user_email_extension.rb:6:in `execute' 
/var/www/discourse/app/jobs/regular/critical_user_email.rb:12:in `execute' 
/var/www/discourse/app/jobs/base.rb:249:in `block (2 levels) in perform' 
rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/app/jobs/base.rb:236:in `block in perform' 
/var/www/discourse/app/jobs/base.rb:232:in `each' 
/var/www/discourse/app/jobs/base.rb:232:in `perform' 
sidekiq-6.5.8/lib/sidekiq/processor.rb:202:in `execute_job' 
sidekiq-6.5.8/lib/sidekiq/processor.rb:170:in `block (2 levels) in process' 
sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:177:in `block in invoke' 
/var/www/discourse/lib/sidekiq/pausable.rb:134:in `call' 
sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:179:in `block in invoke' 
sidekiq-6.5.8/lib/sidekiq/middleware/chain.rb:182:in `invoke' 
sidekiq-6.5.8/lib/sidekiq/processor.rb:169:in `block in process' 
sidekiq-6.5.8/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch' 
sidekiq-6.5.8/lib/sidekiq/job_retry.rb:113:in `local' 
sidekiq-6.5.8/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch' 
sidekiq-6.5.8/lib/sidekiq.rb:44:in `block in <module:Sidekiq>' 
sidekiq-6.5.8/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch' 
sidekiq-6.5.8/lib/sidekiq/processor.rb:263:in `stats' 
sidekiq-6.5.8/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch' 
sidekiq-6.5.8/lib/sidekiq/job_logger.rb:13:in `call' 
sidekiq-6.5.8/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch' 
sidekiq-6.5.8/lib/sidekiq/job_retry.rb:80:in `global' 
sidekiq-6.5.8/lib/sidekiq/processor.rb:124:in `block in dispatch' 
sidekiq-6.5.8/lib/sidekiq/job_logger.rb:39:in `prepare' 
sidekiq-6.5.8/lib/sidekiq/processor.rb:123:in `dispatch' 
sidekiq-6.5.8/lib/sidekiq/processor.rb:168:in `process' 
sidekiq-6.5.8/lib/sidekiq/processor.rb:78:in `process_one' 
sidekiq-6.5.8/lib/sidekiq/processor.rb:68:in `run' 
sidekiq-6.5.8/lib/sidekiq/component.rb:8:in `watchdog' 
sidekiq-6.5.8/lib/sidekiq/component.rb:17:in `block in safe_thread'

環境

hostname gaoa-discourse-app
process_id 11140
application_version ea4f7fb660cb4cb5cba3763e9a28352123d39591
current_db default
current_hostname forum.[xxx].com
job Jobs::CriticalUserEmail
problem_db default
time 8:54 am
opts type account_suspended
--- --- --- ---
--- ---
user_id 3919
user_history_id 41800
current_site_id default

sidekiqステータスを追加するために編集:

Hi @omarfilip,

I don’t have a solution for you, but I wanted to confirm I was able to replicate this experience on an installation of Discourse that does not have many plugins.

Steps taken to replicate:

  1. Select a user from /admin/users/list/active and manually suspend with the suspend button.

image

  1. Add text in the “Email message” field.

  1. Click the suspend button and confirm the user is now suspended.

image

Result: No email is sent, and there is a Job Exception in the error logs.

Message (3 copies reported)

Job exception: undefined method `topic' for nil:NilClass


Backtrace

/var/www/discourse/app/jobs/regular/user_email.rb:116:in `message_for_email'
/var/www/discourse/app/jobs/regular/user_email.rb:76:in `send_user_email'
/var/www/discourse/app/jobs/regular/user_email.rb:39:in `execute'
/var/www/discourse/plugins/chat/lib/chat/user_email_extension.rb:6:in `execute'
/var/www/discourse/app/jobs/regular/critical_user_email.rb:12:in `execute'
/var/www/discourse/app/jobs/base.rb:249:in `block (2 levels) in perform'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rails_multisite-4.0.1/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/app/jobs/base.rb:236:in `block in perform'
/var/www/discourse/app/jobs/base.rb:232:in `each'
/var/www/discourse/app/jobs/base.rb:232:in `perform'
「いいね!」 5

@omarfilip様

サスペンションのメールは送信されましたか?

私のテストサスペンションに関連するメールは、[date=2023-04-09 time=06:10:00 timezone=“America/New_York”]に送信されましたが、それ以降私からの追加操作はなく、新しいサスペンションは同じエラーで失敗し続けています。

「いいね!」 1

レポートと再現手順をありがとうございます @omarfilip@southpaw :+1:

対応する担当者が割り当てられ、すぐに回答が得られる見込みです :crossed_fingers: :slight_smile:

「いいね!」 2

新しいサスペンションでも同じ問題が発生しています。失敗キューに積み込まれるだけです。

なお、こちらは内部で対応が割り当てられており、数日中に修正作業を進める予定です。

「いいね!」 2

:+1: で修正されるはずです。

「いいね!」 2

ありがとうございます。これでサイドキックのスタックされたジョブがすぐに解消されました。:+1:

「いいね!」 2