From:などに改行まで含めてBエンコードしてくるようなメッセージがあったので、改行は空白に置き換えるようにしてしまいました。こんな感じ。
From: hogehoge <foo@example.com>
index.boxを改行区切りにしたのでヘッダのアイテムに改行が含まれているとエントリがずれてしまうのでした(そもそも入ってちゃいけないですし)。
IMAP4のBODYのセクション指定は必要以上に複雑で一貫性に欠けている*1上にRFC3501でも深く説明されていないので少しまとめてみました。といっても、RFC3501ではmessage/rfc822がネストしている状況を考慮してないとしか思えず、規定通りだとネストしているmessage/rfc822を扱えないため、リファレンスと言われているUW-IMAPの動作などを元に補っている部分があります。勘違いしている部分を見つけたら教えていただけると助かります。ちなみにBODYのセクション指定とは、BODY[1]やBODY[HEADER]、BODY[1.1.MIME]などのような指定をする時の[]内の部分のことです。
はじめに、HEADERやMIMEなどの部分を除いて1や1.1のようなパート指定子の部分を考えます。最も重要なことは、パート指定子で指される先は、MIMEパートである場合とメッセージである場合があるという点です。ここでのメッセージは全体としてのメッセージと、message/rfc822によって包含されているメッセージを含みます。
まず、空のパート指定子はメッセージ全体を指します。
あるパート指定子iがメッセージを指す場合には、i.j(iが1の場合には1.j、iが空のパート指定子の場合にはj)の指す先は以下の条件によって変わります。
またあるパート指定子iがパートを指す場合には、i.jの指す先は以下のようになります。
特にiがパートを指し、そのパートのContent-Typeがmessage/rfc822の場合に、i.1が包含しているメッセージを指さないことに注意が必要です。そのようなメッセージを指すパート指定子は存在しません。つまり、メッセージを指すパート指定子は、メッセージ全体を指す空のパート指定子以外には、message/rfc822がネストしている場合にしか現れません。
次にHEADERやMIMEなどのセクション指定子です。
あるパート指定子iがメッセージを指す場合には、以下のようになります。
またあるパート指定子iがパートを指す場合には、以下のようになります。
いくつか例を挙げてみます。
A, Bのように大文字で指定されているのはメッセージ、a, bのように小文字で指定されているのはパートになります。
A. text/plain
空のパート指定子がAを指します。
A. multipart/mixed b. text/plain c. application/octet-stream
空のパート指定子がAを、1がbを、2がcを指します。
A. message/rfc822 B. text/plain
空のパート指定子がAを、1がBを指します。
A. multipart/mixed b. message/rfc822 C. text/plain d. application/octet-stream
空パート指定子がAを、1がbを、2がdを指します(Cを指すパート指定子は存在しません)。
A. message/rfc822 B. message/rfc822 C. text/plain
空のパート指定子がAを、1がBを指します、1.1がCを指します。
A. message/rfc822 B. multipart/mixed c. text/plain d. application/octet-stream
空のパート指定子がAを、1がBを、1.1がcを、1.2がdを指します。
A. message/rfc822 B. multipart/mixed c. message/rfc822 D. multipart/related e. text/plain f. image/jpeg g. application/octet-stream
空のパート指定子がAを、1がBを、1.1がcを、1.1.1がeを、1.1.2がfを、1.2がgを指します(Dを指すパート指定子は存在しません)。
*1 その結果サーバによって返される結果がまちまち