JavaMailを使う時はちゃんとタイムアウト値を設定しよう
いやあ、びっくりしました。JavaMailを使ってSMTPやPOP3のサーバーとやりとりする時、通信タイムアウトのデフォルト値って''無限大''なんですね。サーバーがこけていたりすると、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の著者の方のページにも、詳細な情報があります。
- JavaMail @ Shin Kinoshita's Home
それにしても、デフォルトが''無限大''というのは「タイムアウト」という考え方に気づきにくくなるので、設計としてはどうかと思いますねえ(ぼそっ)。はい、言い訳ですね。そうです。
追記
SunのJavaMail APIのドキュメントも確認しました。
- JavaMail API documentation: Package com.sun.mail.smtp
- JavaMail API documentation: Package com.sun.mail.imap
- JavaMail API documentation: Package com.sun.mail.pop3
これによると、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日の日記に追記しました。