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にしました。
以上。
-
category:
- 日記