基本情報でわかる MIME タイプ 「電子メールの仕組みを知れば役割がわかる」
error
この記事は基本情報技術者試験の旧制度( 2022 年以前)の記事ですが、試験対策ではなく、技術用語を理解する上では問題ないと考えています。
試験対策としてお読みになる場合は、現在の試験制度では出題されない午後問題を一部題材にしているので、ご注意ください。
この連載では、基本情報技術者試験によく出題されるテクノロジー関連の用語を、午前問題と午後問題のセットを使って解説します。
午前問題で用語の意味や概念を知り、午後問題で技術の活用方法を知ってください。それによって、単なる丸暗記では得られない明確さで、用語を理解できるようになります。
今回のテーマは、 MIME です。
MIME に関する午前問題 ~ MIME とは~
いきなりですが、以下の午前問題を見てください。
インターネットにおける電子メールの規約で,ヘッダフィールドの拡張を行い,テキストだけでなく、音声,画像なども扱えるようにしたものはどれか。
ア HTML イ MHS ウ MIME エ SMTP
この問題の答えは、選択肢ウの MIME です。
そもそも、インターネットの電子メールは、テキスト(文字だけから構成されたデータ)しか送れないようになっています。
電子メールに、音声や画像などを添付できるのは、それらをテキストに変換しているからです。そのための規格が、 MIME なのです。
MIME は、 Multipurpose Internet Mail Extensions (多目的なインターネットのメールの拡張)の略語で「マイム」と読みます。 MIME は、もともとテキストしか送れないインターネットの電子メールを、音声や画像なども送れるように、多目的に拡張したものです。
解答ウ
MIME に関する午後問題 ~ MIME の仕組み ~
先ほどの午前問題で、 MIME という言葉の意味と概要はわかりましたが、どのような仕組みで音声や画像などの添付が実現されているのでしょうか。
以下は、 MIME に関する午後問題です。この問題を解けば、仕組みがわかります。説明の区切りごとにポイント解説を挿入しますので、少しずつ問題を見ていきましょう。
電子メールで用いる MIME 形式に関する次の記述を読んで,設問 1, 2 に答えよ。
インターネットの電子メールは,規格上, US-ASCII のような 7 ビット符号で書か れたテキストしか送信できない。そのため, UTF-8 のような 8 ビット符号で書かれ たテキストや,画像データなどのバイナリデータを電子メールで送信する際は, MIME ( Multipurpose Internet Mail Extensions ) と呼ばれる書式 (以下, MIME 形式という) に従ってメッセージを作成する。
- インターネットで送れるテキストは、半角英数記号の 1 文字を 7 ビットで表す US-ASCII だけです。
- US-ASCII の文字でないデータは、 MIME という形式で、 US-ASCII の文字に変換して送っています。
MIME 形式では, 7 ビット符号で書かれたテキスト以外のコンテンツを, base64 や quoted-printable などの方式で 7 ビット符号に変換 (以下,エンコードという) する。 ただし,エンコードを行うコンピュータのメモリ上では, 7 ビット符号を,先頭に 0 のビットを 1 ビット付加した 8 ビット ( 1 バイト) として取り扱う。
- MIME 形式には、 base64 や quoted-printable などがあります。
- メモリ上では、 7 ビット符号の先頭に 0 を付加して、 8 ビット( 1 バイト)で取り扱います。メモリは、 8 ビット単位で読み書きするものだからです。
base64 によるエンコードでは,コンテンツを先頭から 6 ビットごとに区切り,各 6 ビットを,ビットパターンごとに定められた, US-ASCII の図形文字 1 文字に変換する。
- base64 では、データの全体を先頭から 6 ビットごとに区切り、それぞれを US-ASCII の 1 文字に変換します。
- 6 ビットなら、 7 ビットの US-ASCII のいずれかの文字に対応付けられるからです。
- どのように対応付けるのかは、あらかじめ決められています。
一方, quoted-printable によるエンコードでは,コンテンツをバイト列とみなし, US-ASCII の制御文字又は図形文字 “=” と一致するバイト,及び先頭ビットが 1 のバイトを, “=XX” ( XXは 2 桁の 16 進数字列) の形の 3 文字の US-ASCII の図形文字列に置き換える。US-ASCII の図形文字 ( “=” を除く) と一致するバイトは置き換えない。幾つかの例外があるが,ここでは考慮しなくてよいものとする。
- quoted-printable では、データの全体を 1 バイト( 8 ビット)ごとに区切り、その 1 バイトの最上位ビットが 0 であり、かつ、制御文字(改行や TAB などを表す特殊な文字)でないなら、 7 ビットの US-ASCII の文字と同じなので、そのまま送ります。
- そうでない場合は、 1 バイトを “=XX” という形式の US-ASCII の 3 文字に変換します。 “XX” は、 1 バイトのデータを 2 桁の 16 進数で表したものです。たとえば、 11111111 という 1 バイト( 8 ビット)のデータは、 “=FF” に変換します。
- なお、 “=” は、 “=XX” という形式で使うので、 “=” を文字として送る場合には、 “=3D” に変換します。 US-ASCII で “=” の符号は、 0111101( 16 進数で 3D )です。
例えば,UTF-8 で書かれたテキスト “©△IPA△2012.” ( “©” には 16 進数で C2A9 の 2 バイトの符号が,他の文字には US-ASCII と同じ 1 バイトの符号が,それぞれ割り当てられている) をa1でエンコードすると “=C2=A9△IPA△2012.” になる。同じテキストをa2でエンコードすると “wqkgSVBBIDIwMTIu” となり,いずれも US-ASCII に含まれる図形文字だけから成る 7 ビット符号のバイト列となる。ここで, “△” は空白 ( 符号は 16 進数で 20 ) を 表すものとする。
- quoted-printable と base64 には、それぞれ適した場面があります。
- 音声や画像のデータを例にすると面倒なので、ここでは、 1 文字を 8 ビットで表す UTF-8 という形式のテキストを例にしています。
- 空欄 a1 では、 C2A9 という符号の文字を “=C2” と “=A9” に変換し、その他の US-ASCII と同じ符号の文字を変換せずに、 “△IPA△2012” としているので、 quoted-printable です。
- 空欄 a1 が quoted-printable なので、空欄 a2 は base64 です。
- base64 では、データの全体を先頭から 6 ビットごとに区切って US-ASCII 文字に変換するので、変換後のテキストは、元のテキストと、まったく異なったものになっています。
エンコード後のデータ量に着目すると,大部分が US-ASCII に含まれる図形文字で構成されているテキストのエンコードにはa3が適しており,バイナリデータのエンコードにはa4が適している。
- base64 は、どのようなデータでも、 6 ビットごとに区切って 7 ビットの US-ASCII に変換するので、変換後のデータ量が多くなります。
- quoted-printable では、最上位ビットが 1 でない 8 ビットの文字(制御文字と “=” でない文字)なら、 7 ビットの US-ASCII に変換されるので、データ量が少なくなります。ただし、最上位ビットが 1 の 8 ビットのデータは、 “=XX” という 3 文字( US-ASCII で 3 文字 = 7 ビット× 3 = 21 ビット)に変換されるので、データ量が多くなります。 6 ビットが 7 ビットになる base64 より、はるかに多くなります。
- したがって、データ量を少なくするには、大部分が US-ASCII に含まれる文字で構成されているテキストデータなら quoted-printable が適していて(空欄 a3 )、最上位ビットが 1 のデータが多々あるバイナリデータなら base64 が適しています(空欄 a4 )。
UTF-8 では,平仮名 1 文字に先頭ビットが 1 であるバイト三つから成る符号を割り当てているので, UTF-8 で書かれた 6 文字の平仮名から成るテキストを quoted-printable でエンコードすると,b文字の文字列となる。
- quoted-printable では、先頭ビットが 1 である 1 バイトのデータが “=XX” という US-ASCII の 3 文字に変換されるので、先頭ビットが 1 で、 1 文字が 3 バイトで、全部で 6 文字あるなら、 3 × 3 × 6 = 54 文字(空欄 b )に変換されます。
- 設問 1
- 記述中のに入れる正しい答えを,解答群の中から選べ。ただし, a1 ~ a4 に入れる答えは, a に関する解答群の中から組合せとして正しいものを選ぶものとする。
a に関する解答群
a1 | a2 | a3 | a4 | |
---|---|---|---|---|
ア | base64 | quoted-printable | base64 | quoted-printable |
イ | base64 | quoted-printable | quoted-printable | base64 |
ウ | quoted-printable | base64 | base64 | quoted-printable |
エ | quoted-printable | base64 | quoted-printable | base64 |
b に関する解答群
ア 8 イ 18 ウ 24 エ 54
- これらは、設問 1 の a1, a2, a3, a4 および b の解答群です。
- 設問 2
- MIME 形式を使用すると, 1 通の電子メールに複数のコンテンツを格納することができる。 1 通の電子メールに二つのコンテンツを格納した MIME 形式のメッセージは,図 1 のようになる。
- 設問 2 を解くと、先ほどの午前問題の中にあった「ヘッダフィールドの拡張」とは何であるかがわかります。
- 電子メールには、メールの「コンテンツ(内容)」の前に「ヘッダ(メールアドレス、件名、メールサーバなどの情報)」があります。図 1 に示されたように、 MIME 形式のメッセージには、通常の電子メールのヘッダの後に、
MIME-Version: 1.0
およびContent-Type: multipart/mixed; boundary="delimiter"
という情報が付加されています。これらが「ヘッダフィールドの拡張」です。
-
boundary="delimiter"
の delimiter には,格納したコンテンツの区切りを示す文字列を指定する。
- 「ヘッダフィールドの拡張」で注目してほしいのは、
boundary="delimiter"
の部分です。これは、コンテンツの区切りを示す文字列を指定しています。 - MIME 形式では、メールのコンテンツに、通常のテキストだけでなく、 base64 や quoted-printable でテキストに変換したデータが含まれる場合があるので、それぞれの区切りが必要なのです。
- 区切りを示す文字列は、何でもでも構わないのですが、ここでは、例として “delimiter” という文字列にしています。
- delimiter の先頭に “–” を付けたものが一つのコンテンツの開始を示し, delimiter を “–” で囲ったものが最後のコンテンツの終了を示す。
- 区切りを示す文字列を “delimiter” とした場合には、 “–delimiter” がコンテンツの開始(区切りの開始)を示し、 “–delimiter–” がコンテンツの終わり(区切りの終わり)を示します。
- delimiter には,コンテンツに含まれる行が,誤ってコンテンツの区切りと認識されることのないような文字列を,選択しなければならない。
- 区切りを示す文字列には、コンテンツの内容と区別できる文字列を選ぶ必要があります。
- なぜなら、たとえば、 “–aaa” と “–aaa–” がコンテンツの区切りを示す場合には、もしも、コンテンツの内容として “–aaa” や “–aaa–” があったら、内容ではなく区切りとみなされてしまうからです。
- ”コンテンツごとの属性を示すヘッダ” には,テキストや画像などのコンテンツの種類や,エンコードの方式などを指定する。エンコードの方式には “base64” や “quoted-printable” のほか,コンテンツがエンコードされていない 7ビット符号のテキストであることを示す “7bit” などが指定できる。
- コンテンツの開始を示す “–delimiter” の後には、そのコンテンツの形式を示すヘッダを置きます。
- このヘッダの中にある “7bit”, “base64”, “quoted-printable” という情報で、コンテンツの形式がわかります。
- 図 1 中の “コンテンツ1” が 7 ビット符号のテキストであって,図 2 に示す 3 行をコンテンツに含むとき, delimiter としてふさわしくない文字列を,解答群の中から三つ選べ。
解答群
ア --case1
イ --case2
ウ --case3
エ case1
オ case2
カ case3
キ case1--
ク case2--
ケ case3--
- 解答群の中から、もしも、それをコンテンツの区切りの文字列として使うと、
"--区切り文字"
または"--区切り文字--"
が、コンテンツである"case1"
,"--case2"
,"--case3--"
と一致してしまうものを選びます。 - 選択肢オの
"case2"
は、先頭に"--"
を付けると、"--case2"
と一致します。 - 選択肢カの
"case3"
は、"--"
で囲むと、"--case3--"
と一致します。 - 選択肢ケの
"case3--"
は、先頭に"--"
を付けると、"--case3--"
と一致します。 - したがって、コンテンツの区切りの文字列として使えないのは、オ、カ、ケです。
解答設問 1 a ― エ, b ― エ 設問 2 オ、カ、ケ
いかがでしたか?
電子メールの仕組みを知ったことで、 MIME の役割を、しっかりと理解できたでしょう。
この連載では、今後も、多くの受験者が苦手としている用語を取り上げて行きます。それでは、またお会いしましょう!
label 関連タグ免除試験を受けた 74.9% の方が、 科目A免除資格を得ています。
基本情報でわかる IPアドレス と サブネットマスク
update基本情報でわかる ホワイトボックステスト
update基本情報でわかる トランザクション
update基本情報でわかる コンパイラ 最適化
update基本情報でわかる CRC 「具体例を見て体験すれば仕組みがわかる」
update基本情報でわかる 浮動小数点 「3つの情報で1つの数を表す仕組みを知れば、浮動小数点数がわかる」
update基本情報でわかる MIME タイプ 「電子メールの仕組みを知れば役割がわかる」
update基本情報でわかる 7セグメントLED 「 1 と 0 を書き込めば点灯するパターンがわかる」
update基本情報でわかる 論理演算 「真理値表を書けば、半加算器と全加算器の仕組みがわかる」
update基本情報でわかる SMTP / POP3 「ITエンジニア視点で見れば役割がわかる」
update『プログラムはなぜ動くのか』(日経BP)が大ベストセラー
IT技術を楽しく・分かりやすく教える“自称ソフトウェア芸人”
大手電気メーカーでPCの製造、ソフトハウスでプログラマを経験。独立後、現在はアプリケーションの開発と販売に従事。その傍ら、書籍・雑誌の執筆、またセミナー講師として活躍。軽快な口調で、知識0ベースのITエンジニアや一般書店フェアなどの一般的なPCユーザの講習ではダントツの評価。
お客様の満足を何よりも大切にし、わかりやすい、のせるのが上手い自称ソフトウェア芸人。
主な著作物
- 「プログラムはなぜ動くのか」(日経BP)
- 「コンピュータはなぜ動くのか」(日経BP)
- 「出るとこだけ! 基本情報技術者」 (翔泳社)
- 「ベテランが丁寧に教えてくれる ハードウェアの知識と実務」(翔泳社)
- 「ifとelseの思考術」(ソフトバンククリエイティブ) など多数