IMAP4でメールを検索する際、SEARCHコマンドを使って複雑な検索をする一部メールクライアントへの対策

OutlookやWindows Mail、Thunderbird、Becky!など主要なメールクライアントでは、IMAP4でメールを検索する際、検索条件の組み立てをまずメールクライアント内部で処理し、最後に"FETCH xxx:xxx"というよう形でサーバ側に必要なメールだけを要求するやり方を行っています。

その一方、一部のメールクライアントでは、SEARCHコマンドとそのオプション"OR"を多用し、複雑な検索式を投げかけるものがあります。EPSTIMAP4S ver4.49以降では、そうした一部のメールクライアントの出す複雑な検索式に対しても対応できるように強化しました。なお、SEARCHコマンドですべての条件を指定するメールクライアントは、非常に特殊で少数派であるのが現状です。実際、RFCにもSEARCHコマンドがどのレベルまで使えるようにすべきとの細かな規定はまったくありません。

1.準備

あらかじめ「サポート2」に公開された2015年8月20日掲載の最新差分アップデートを適用してください。
[64bit版]
・E-Post Mail Server Enterprise II (x64) 20150807差分 掲載日:2015-08-20
・E-Post Mail Server Standard (x64) 20150807差分 掲載日:2015-08-20
[32bit版]
・E-Post Mail Server Enterprise / Enterprise II 20150807差分 掲載日:2015-08-20
・E-Post Mail Server Standard 20150807差分 掲載日:2015-08-20

2.SEARCHコマンドの対策

(1) SEARCHコマンドで日付検索が行われたときの実状見直し

E-PostのIMAP4サービスにおいて、従来バージョンのモジュールでは、日付検索を行った場合、[ファイルの作成日時]かつ[UTC日付]で検索を行っていました。そのため、ユーザーの想定しているメールが必ずしも検索される結果となっていませんでした。

上記最新差分を適用することにより、新バージョンEPSTIMAP4S v4.49以降では、日付検索を行う場合、デフォルトの[ファイルの作成日時]を[ファイル更新日時]に変更し、さらに、デフォルトの[UTC日付]を[ローカル日付]に変更しました。

※このデフォルト値を意図的に従来バージョンと同じようにさせたい場合は、"<メール作業フォルダ>\REG"で管理されている設定ファイルを作成して設定します。通常は設定する必要はありません。
 <メール作業フォルダ>\REG\SOFTWARE\EMWAC\IMS\SearchLocalTime.1
 (デフォルト値=1 0:UTC日付 1:ローカル日付)
 <メール作業フォルダ>\REG\SOFTWARE\EMWAC\IMS\SearchAccessType.1
 (デフォルト値=0 0:更新日時 1:アクセス日時 2:作成日時)

(2) SEARCHコマンドで"OR"が指定されたときの検索ロジック見直し

SEARCHコマンドでより複雑な条件が指定されたときの検索ロジックを見直しました。新バージョンEPSTIMAP4S v4.49以降での検索可能な条件式の項目数は、括弧を含めて100項です。また、文字検索の1項目あたりの文字数の上限は、79byteです。

たとえば、以下の式の場合は、括弧も含めて5項目とみなします。
. SEARCH OR <項1> ( <項3> <項4> )

また、文字列検索は、各項目での検索文字数の上限となります。
. SEARCH OR SUBJECT <Max79byte> OR FROM <Max79byte> TO <Max79byte> ...

(検索条件例)
SEARCH [A]
SEARCH [A] [B]
SEARCH OR [A] [B]
SEARCH OR [A] [B] [C]
SEARCH OR (OR [A] [B]) [C]
SEARCH (OR [A] [B])
SEARCH (OR [A] [B]) [C]
SEARCH (OR (OR [A] [B]) [C])
SEARCH (OR .... (OR (OR [A] [B]) [C]) .... [N])

SEARCH OR .... OR [A] OR [B] OR [C] .... [N] 括弧なしOR
SEARCH [A] [B] [C] .... [N] 括弧なしAND
SEARCH OR ([A] [B]) ([C] [D])
SEARCH ([A] [B]) ([C] [D])
SEARCH (([A] [B]) ([C] [D])) (([E] [F]) ([G] [H]))
SEARCH OR (([A] [B]) ([C] [D])) (([E] [F]) ([G] [H]))



(参考:最新差分プログラムの更新情報)
[EPSTIMAP4]
 v4.48 2015.06.15
 1.MS-OFFICEファイルのMIMEタイプが長すぎて途中で切られてしまう不具合の修正。
 2.添付ファイルの名称が複数行にまたがっている場合の処理。
 3.ORを含んだ検索結果が正しく出力されない不具合の修正。
 4.検索時の日付をUTC日付かローカル日付かに変更できるオプションを追加した。
  <メール作業フォルダ>\REG\SOFTWARE\EMWAC\IMS\SearchLocalTime.1
  (デフォルト値=1 0:UTC日付 1:ローカル日付)
 5.受信日検索がファイル作成日時から更新日時に変更した。
  <メール作業フォルダ>\REG\SOFTWARE\EMWAC\IMS\SearchAccessType.1
  (デフォルト値=0 0:更新日時 1:アクセス日時 2:作成日時)
 6.SELCET命令のフォルダ名に末尾に半角スペースが含まれると、フォルダ移動から抜け出れなくなる不具合の修正。
 7.多重構造の複雑な検索で正常な結果が出力出来るよう検索ロジックを見直した。
 
 v4.49 2015.07.16
 1.Evolution(linux系メーラ)でメールが一部読み込めない不具合の修正。(BODYSTRUCTUREの構造出力の修正)
 2.BODY情報取得時に2件目以降の応答内容の一部が欠けてしまう不具合の修正。
 3.対象メールのヘッダ構造に不正な書式があるとBODY[HEADER]で正しいヘッダが出力されない不具合の修正。
 4.対象メールのヘッダ構造に不正な書式があるとBODY[n.MIME]で正しい結果が出力されない不具合の修正。
 5.SEARCH命令で検索対象番号をカンマ区切りで複数羅列するとハングする不具合の修正。(v4.48での修正ミス)
 6.SEARCH命令で検索対象NOを複数羅列すると正しい結果が得られない不具合の修正。(v4.48での修正ミス)
 7.SEARCH命令で検索対象NOにNOT指定を行うと正しい結果が得られない不具合の修正。
 8.Javamailを使った任意のメール受信でメールが一部読み込めない不具合の修正。(BODYSTRUCTUREの構造出力の修正)
 9.QMAIL3で添付付きメールが開けない不具合の修正。
 10.FETCH BODY[HEADER]の応答で余分な半角スペースが含まれて出力されないようにした。
 11.複数の命令が1度に受信された時、応答結果に無効なデータが含まれることがあるのを修正。
 12.Content-Type: 1行内に type="xxx/xxx";が記述された後に、boundary="xxx"が含まれていると入れ子のbody[n.n]等が正しく抽出できない不具合の修正。
 13.Evolution 3系で大きなサイズのメールの受信に失敗する不具合の修正。(BODY[]の応答でBODY[]として応答していなかった)
 14.MIME構造で(multipart(text,multipart(html))のような構造のとき構造出力結果の順序が正しくなくなる不具合の修正。
 15.FETCH n ENVELOPEの応答で不正な文字があると出力が正しくなくなる不具合の修正。
 16.MESSAGE/RFC822の構造出力結果がバッファオーバフローする可能性のある不具合の修正。
 17.MESSAGE/RFC822の構造出力への対応(入れ子の解析)でTEXT以外構造が出力されない不具合の修正。
 18.Content-TypeにPGPが含まれている時正しい構造が生成できない不具合の修正。
 19.MIMEパートの終わり判定が失敗する場合がある不具合の修正。