JavaMailを使う時はちゃんとタイムアウト値を設定しよう

いやあ、びっくりしました。JavaMailを使ってSMTPPOP3のサーバーとやりとりする時、通信タイムアウトのデフォルト値って''無限大''なんですね。サーバーがこけていたりすると、JavaMailの通信処理の中でブロックされてしまって、帰ってこなくなります。

各Providerに以下のようなプロパティがありますので、適切に設定しておいた方が良いです。

  • mail.smtp.conectiontimeout
  • mail.smtp.timeout
  • mail.imap.conectiontimeout
  • mail.imap.timeout
  • mail.pop.connectiontimeout
  • mail.pop.timeout

このあたりの情報が参考になりました。

connectiontimeout はシンプルなケースでは new Socket() が復帰するまでの時間の指定です。

mail.smtp.timeout は、要するに socket の SO_TIMEOUT 値です。read() でのブロックする時間を指定します。SMTP のコマンドを送信してサーバからのレスポンスが指定時間なければ例外が発生します。

「JavaMail完全解説」ISBN:4798000892の著者の方のページにも、詳細な情報があります。

それにしても、デフォルトが''無限大''というのは「タイムアウト」という考え方に気づきにくくなるので、設計としてはどうかと思いますねえ(ぼそっ)。はい、言い訳ですね。そうです。

追記

SunのJavaMail APIのドキュメントも確認しました。

これによると、mail.{smtp|imap|pop3}.connectiontimeoutは、"Socket connection timeout value in milliseconds. Default is infinite timeout."、mail.{smtp|imap|pop3}.timeoutは、"Socket I/O timeout value in milliseconds. Default is infinite timeout."ということのようです。やっぱりデフォルト値は無限大かあ。

さらに追記

JavaMailの件の箇所の実装を調べるため、ソースを拝見・・・というところまで来ましたが眠いので今日はこれまで。

12月15日の日記に追記しました。