Sidekiq を使ったメール送信時に uninitialized constant Mail::* が発生した

永田です。

弊社では Rails をつかって Relationというサービスを構築しています。 サービス内部では処理の効率化のために、非同期処理を様々な機能で使っています。 Rails 4から使えるようになった ActiveJob を Sidekiq で使っています。キューの管理は Redis を使っています。

ActiveJob ではメールの送信もおこなっています。

ActiveJob でメールの送信をおこなうようになってから1年以上は経ちますが最近、奇妙なエラーが発生しました。うちで発生したのは以下の2パターンでした。

uninitialized constant Mail::SMTPConnection

uninitialized constant Mail::AddressList::Address

これには悩まされましたが、mail gem の issue にてすでに議論されていました。

NameError: uninitialized constant Mail::Parsers::ContentTypeParser · Issue #912 · mikel/mail · GitHub

mail gem がスレッドセーフではなかったことが原因とのこと。対応策としては、この issue にも、Sidekiq の Wiki にも載っていますが、

Problems and Troubleshooting · mperham/sidekiq Wiki · GitHub

initializer 内のファイルに

Mail.eager_autoload!

とすることになります。