dovecotで認証がたまに失敗してた

http://instance-email.com/ がぼちぼち使われるようになってきましたが、次のようなエラーメールが多い時で1日3通くらい来てました。

A Net::IMAP::NoResponseError occurred in background at 2015-11-09 13:31:09 +0900 :
   Authentication failed.
  /home/virtual/.rvm/rubies/ruby-2.2.3/lib/ruby/2.2.0/net/imap.rb:1171:in `get_tagged_response'

rubyのコードではIMAP#authenticateでエラーになっていて、発生タイミングはIMAPプロトコル経由でメールボックスにメールを取りに行くところです。

imap = Net::IMAP.new(HOST, ssl_param)
imap.authenticate('PLAIN', mailbox.full_name, PASSWORD) # <= fail!!!!!

さっきたまたま机の前にいる時にエラーメールが来たので調べるとタイムゾーンが違う同士での日付演算が原因であることがわかりました。

dovecotの認証SQLには、メールアドレスに登録している有効期限日時とNOW関数を使って期限切れなのかを確認しています。
それで、mysqlのNOW関数はJSTを返し、Rails経由で登録した有効期限日時カラムはUTCを返していたので、期限を9時間早く迎えて認証失敗していたのです。

Rails経由の日付カラムはapplication.rbに書いているタイムゾーンに
従って補正された日付が返されますが、DB自体に入っているタイムゾーンはUTCになってるみたいです。

アプリケーション層でも期限チェックをしていますが、 念のためdovecotでも期限チェックしたいのでmysqlのタイムゾーンをUTCにしました。

以上。