2004-07-07 [長年日記]

[Q3] 改行ごとエンコードしてくるのに対処

From:などに改行まで含めてBエンコードしてくるようなメッセージがあったので、改行は空白に置き換えるようにしてしまいました。こんな感じ。

From: hogehoge
<foo@example.com>

index.boxを改行区切りにしたのでヘッダのアイテムに改行が含まれているとエントリがずれてしまうのでした(そもそも入ってちゃいけないですし)。

IMAP4のBODYのセクション指定

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)の指す先は以下の条件によって変わります。

  • メッセージのContent-Typeがmultipart/*の場合にはiの指すメッセージのj番目の子パート
  • メッセージのContent-Typeがmessage/rfc822の場合
    • jが1の場合にはiが指すメッセージが包含しているメッセージ
    • それ以外の場合には未定義
  • それ以外の場合には未定義

またあるパート指定子iがパートを指す場合には、i.jの指す先は以下のようになります。

  • パートのContent-Typeがmultipart/*の場合には、iの指すパートのj番目の子パート
  • パートのContent-Typeがmessage/rfc822の場合
    • パートが包含しているメッセージXのContent-Typeがmultipart/*の場合には、Xのj番目の子パート
    • XのContent-Typeがmessage/rfc822の場合
      • jが1の場合には、Xの包含しているメッセージ
      • それ以外の場合には未定義
    • それ以外の場合には未定義
  • それ以外の場合には未定義

特にiがパートを指し、そのパートのContent-Typeがmessage/rfc822の場合に、i.1が包含しているメッセージを指さないことに注意が必要です。そのようなメッセージを指すパート指定子は存在しません。つまり、メッセージを指すパート指定子は、メッセージ全体を指す空のパート指定子以外には、message/rfc822がネストしている場合にしか現れません。

次にHEADERやMIMEなどのセクション指定子です。

あるパート指定子iがメッセージを指す場合には、以下のようになります。

  • 無指定はメッセージ全体
  • HEADERはメッセージのヘッダ
  • TEXTはメッセージのボディ
  • MIMEは未定義

またあるパート指定子iがパートを指す場合には、以下のようになります。

  • パートのContent-Typeがmessage/rfc822の場合
    • 無指定はパートのボディ(つまり包含されているメッセージ全体)
    • HEADERは包含しているメッセージのヘッダ
    • TEXTは包含しているメッセージのボディ
    • MIMEはパートのMIMEヘッダ
  • それ以外の場合
    • 無指定はパートのボディ
    • HEADERは未定義
    • TEXTは未定義
    • MIMEはパートのMIMEヘッダ

いくつか例を挙げてみます。

A, Bのように大文字で指定されているのはメッセージ、a, bのように小文字で指定されているのはパートになります。

例1

A. text/plain

空のパート指定子がAを指します。

BODY[]
Aの全体
BODY[HEADER]
Aのヘッダ
BODY[TEXT]
Aのボディ

例2

A. multipart/mixed
 b. text/plain
 c. application/octet-stream

空のパート指定子がAを、1がbを、2がcを指します。

BODY[]
Aの全体
BODY[HEADER]
Aのヘッダ
BODY[TEXT]
Aのボディ(マルチパートを展開した形)
BODY[1]
bのボディ
BODY[1.MIME]
bのMIMEヘッダ
BODY[2]
cのボディ
BODY[2.MIME]
cのMIMEヘッダ

例3

A. message/rfc822
 B. text/plain

空のパート指定子がAを、1がBを指します。

BODY[]
Aの全体
BODY[HEADER]
Aのヘッダ
BODY[TEXT]
Aボディ(つまりBの全体)
BODY[1]
Bの全体
BODY[1.HEADER]
Bのヘッダ
BODY[1.TEXT]
Bのボディ

例4

A. multipart/mixed
 b. message/rfc822
  C. text/plain
 d. application/octet-stream

空パート指定子がAを、1がbを、2がdを指します(Cを指すパート指定子は存在しません)。

BODY[]
Aの全体
BODY[HEADER]
Aのヘッダ
BODY[TEXT]
Aのボディ(マルチパートを展開した形)
BODY[1]
bのボディ(つまり、Cの全体)
BODY[1.HEADER]
Cのヘッダ
BODY[1.TEXT]
Cのボディ
BODY[1.MIME]
bのMIMEヘッダ
BODY[2]
dのボディ
BODY[2.MIME]
dのMIMEヘッダ

例5

A. message/rfc822
 B. message/rfc822
  C. text/plain

空のパート指定子がAを、1がBを指します、1.1がCを指します。

BODY[]
Aの全体
BODY[HEADER]
Aのヘッダ
BODY[TEXT]
Aのボディ(つまり、Bの全体)
BODY[1]
Bの全体
BODY[1.HEADER]
Bのヘッダ
BODY[1.TEXT]
Bのボディ(つまり、Cの全体)
BODY[1.1]
Cの全体
BODY[1.1.HEADER]
Cのヘッダ
BODY[1.1.TEXT]
Cのボディ

例6

A. message/rfc822
 B. multipart/mixed
  c. text/plain
  d. application/octet-stream

空のパート指定子がAを、1がBを、1.1がcを、1.2がdを指します。

BODY[]
Aの全体
BODY[HEADER]
Aのヘッダ
BODY[TEXT]
Aのボディ(つまり、Bの全体)
BODY[1]
Bの全体
BODY[1.HEADER]
Bのヘッダ
BODY[1.TEXT]
Bのボディ(マルチパートを展開した形)
BODY[1.1]
cのボディ
BODY[1.1.MIME]
cのMIMEヘッダ
BODY[1.2]
dのボディ
BODY[1.2.MIME]
dのMIMEヘッダ

例7

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を指すパート指定子は存在しません)。

BODY[]
Aの全体
BODY[HEADER]
Aのヘッダ
BODY[TEXT]
Aのボディ(つまり、Bの全体)
BODY[1]
Bの全体
BODY[1.HEADER]
Bのヘッダ
BODY[1.TEXT]
Bのボディ(マルチパートを展開した形)
BODY[1.1]
cのボディ(つまり、Dの全体)
BODY[1.1.HEADER]
Dのヘッダ
BODY[1.1.TEXT]
Dのボディ(マルチパートを展開した形)
BODY[1.1.MIME]
cのMIMEヘッダ
BODY[1.1.1]
eのボディ
BODY[1.1.1.MIME]
eのMIMEヘッダ
BODY[1.1.2]
fのボディ
BODY[1.1.2.MIME]
fのMIMEヘッダ
BODY[1.2]
gのボディ
BODY[1.2.MIME]
gのMIMEヘッダ

*1  その結果サーバによって返される結果がまちまち


トップ «前の日記(2004-07-06) 最新 次の日記(2004-07-08)»