1

数日前、Rails アプリケーションからメールを送信するときに問題に直面し始めました。エラーのバックトレースは次のとおりです。

mail-2.4.4/lib/mail/body.rb:143→ get_best_encoding
mail-2.4.4/lib/mail/body.rb:156→ encoded
mail-2.4.4/lib/mail/message.rb:1710→ encoded
actionmailer-3.2.8/lib/action_mailer/base.rb:434→ set_payload_for_mail
actionmailer-3.2.8/lib/action_mailer/base.rb:414→ block in deliver_mail
activesupport-3.2.8/lib/active_support/notifications.rb:123→ block in instrument
activesupport-3.2.8/lib/active_support/notifications/instrumenter.rb:20→ instrument
activesupport-3.2.8/lib/active_support/notifications.rb:123→ instrument
actionmailer-3.2.8/lib/action_mailer/base.rb:413→ deliver_mail
mail-2.4.4/lib/mail/message.rb:229→ deliver
!===> app/controllers/password_resets_controller.rb:16→ create <===!
actionpack-3.2.8/lib/action_controller/metal/implicit_render.rb:4→ send_action
actionpack-3.2.8/lib/abstract_controller/base.rb:167→ process_action

コードを指す行を強調表示しました。あとはgem/railsコードです。この環境では、delayed_job を介して電子メールを送信するものと、それを使用しないものがあることに注意してください。上記のスタック トレースは、delayed_job なしで送信された電子メールを参照しています。

次の変更を適用した開発環境で問題を再現できました。

  • Rails は 3.2.8 ではなく 3.2.9 に変更されました
  • Ruby は 1.9.3-p194 ではなく 1.9.3-p327 に変更されました。
  • Delayed_job はすべてのメールを送信するようになりました。そして、3.0.3 ではなく 3.0.4 にバンプされました。

開発環境でのエラーのバックトレースは次のとおりです。

mail (2.4.4) lib/mail/body.rb:143:in `get_best_encoding'
mail (2.4.4) lib/mail/body.rb:156:in `encoded'
mail (2.4.4) lib/mail/message.rb:1710:in `encoded'
actionmailer (3.2.9) lib/action_mailer/base.rb:434:in `set_payload_for_mail'
actionmailer (3.2.9) lib/action_mailer/base.rb:414:in `block in deliver_mail'
activesupport (3.2.9) lib/active_support/notifications.rb:123:in `block in instrument'
activesupport (3.2.9) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (3.2.9) lib/active_support/notifications.rb:123:in `instrument'
actionmailer (3.2.9) lib/action_mailer/base.rb:413:in `deliver_mail'
mail (2.4.4) lib/mail/message.rb:229:in `deliver'
delayed_job (3.0.4) lib/delayed/performable_mailer.rb:6:in `perform'
delayed_job (3.0.4) lib/delayed/backend/base.rb:95:in `block in invoke_job'
delayed_job (3.0.4) lib/delayed/lifecycle.rb:60:in `call'
delayed_job (3.0.4) lib/delayed/lifecycle.rb:60:in `block in initialize'
delayed_job (3.0.4) lib/delayed/lifecycle.rb:65:in `call'
delayed_job (3.0.4) lib/delayed/lifecycle.rb:65:in `execute'
delayed_job (3.0.4) lib/delayed/lifecycle.rb:38:in `run_callbacks'
delayed_job (3.0.4) lib/delayed/backend/base.rb:92:in `invoke_job'
delayed_job (3.0.4) lib/delayed/backend/base.rb:37:in `block in enqueue'
delayed_job (3.0.4) lib/delayed/backend/base.rb:36:in `tap'
delayed_job (3.0.4) lib/delayed/backend/base.rb:36:in `enqueue'
delayed_job (3.0.4) lib/delayed/message_sending.rb:13:in `method_missing'
!===> app/controllers/password_resets_controller.rb:16:in `create' <===!
actionpack (3.2.9) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
actionpack (3.2.9) lib/abstract_controller/base.rb:167:in `process_action'

見る限り、delayed_job 部分と gem バージョンを除いて、まったく同じスタック トレースのようです。

アプリケーション コントローラーの 16 行目は、開発環境では次のようになります。

UserMailer.delay(:queue => "mail").password_reset_instructions(@user)

製品では次のとおりです。

UserMailer.password_reset_instructions(@user).deliver

トリッキーな部分は、このバグが「ランダム」であることです。毎回発生するわけではなく、発生しない場合でもメールは正常に送信されます。

ここに2つの観察があります:

  • バグがメールに対して 1 回発生すると、同じメールに対して毎回発生します。「同じメール」とは、パラメーターに関係なく、同じコントローラーで同じアクションを意味します。
  • したがって、1 つの電子メールが盗聴される可能性がありますが、他の電子メールは問題ありません。
  • サーバーを再起動すると、すべてのメールで常に問題が修正されます。しかし、しばらくの間だけです。
  • 100% の信頼度でエラーを引き起こす一連の操作はまだ見つかっていません。

私たちはそのバグを数日間調査してきましたが、ここで本当に壁にぶつかっています。私たちが間違っているかもしれないことについて何か考えがありますか?

4

0 に答える 0