2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

意外に知らない電子メールのフォーマット!

電子メールのフォーマットについて再認識してみたい。みなさんは、電子メールのソースをじっくり覗いたことが有るかな?
毎日、携帯でも電子メールを使っているが、電子メールのフォーマットなんて気にしないかも知れない。しかし、技術屋なら常識的に知ってて欲しいと新人研修の先生としては思うのである。
たまたま、私的に我が社の新人研修ネタを作成するので電子メールのフォーマットについて説明してみたい。


1.電子メールの文字表現は苦肉の策

まず、基本的に電子メールは添付される(しかし、本来電子メールは添付を目的とされて作られた物ではない)、画像、音、あらゆる物全てテキストにして送信する。
「エンコードする」っていうけどエンコードが有れば「デコードする」が必ずある。つまり、受信時にデコードされ元の添付ファイルの形式に戻される。
電子メールの前提は、”7ビットで全ての文字を形成する。”だから10進法で0~127までという数値的には中途半端な範囲となる。つまり、128文字を表せる事になる。
だけど、みなさんにはピーンと来たかな。128だなんて、とうてい数千文字有る2バイトコードの日本語なんて扱えっこ無い、無理な話だ。それで困っているところに、日本語つまりJISコードを”ISO-2022-JPで符号化しよう!”って言うことになった。
苦肉の策ってやつだ。
冒頭に言ったように、テキストで全てを表す!と宣言したので、画像、音、その他全てを7ビットで表すため、MIME(マイム)、BASE64(ベースろくよん)が定められた。
みなさんは、ここいら辺の言葉、よく知ってるだろうけどどんな働きするか知ってたかな?
俺は正直言って、当初よく言葉は聞いていたけど詳しい意味はよく解らなかった。


2.電子メールのフォーマットの現実

そんじゃ、実際にメールのソースを見ながら説明しよう。
このメールは、ToとFromをアバウトにしてある。
以下の電子メールのソースは添付ファイル付きで俺の愛用のBeckyインターネットメールのソースである。

① ・・・・・ これは、ヘッダだから割愛する。多分、これはみなさん解ってると思う。ただし、大切なことだけ話す。
ヘッダーだって、7ビット文字で扱わなければならない。さらに厳しいのは、エスケープ文字(代表的なのは\)が扱えない。
したがって、ISO-2022-JPによる日本語が使えない。だけど、それでは、subjectとかは不便なので、BASE64で日本語文字を制御文字を含まない7ビット文字に変換する。そんでもって、メールのソースのsubject見て欲しい。なにやら、” = ”と”?”が有るだろ、これは区切り文字である。 = が最初と最後を表してる。? が、

■ 変換前の文字列の文字セットの指定
■ データの符号化方式の指定
■ 符号化されたデータ

以上の3つを区切っている。

② ・・・・・ これがMIME(Multipurpose Internet Mail Extensions)。
MIMEはファイルを添付するための仕組みを言ってる。つまりここでは、MIMEを宣言してるわけだ。
添付ファイルも画像、音、等色々あるので、各ファイルをメールの中の一つのパートとして取り込める。つまりパートごとに分けて、さらにファイル名や変換方式を指定することによって、エンコードされたファイルが元の形式のファイルにデコード出来るようにするための仕組み。だから、このMIMEを使えばどんなファイルだってメールに取り込めちゃう。

③ ・・・・・ ISO-2022-JPにより7ビット化された本文。化けているが、何故かというと、WinやMacで使われているシフトJISでなく、7ビット化されたISO-2022-JPだから化けている。だから、これでいいのである。
ちなみに、日本語だとこのISO-2022-JPだけど、他の国の言語だとUTF-8が使われるそうである。
UTF-8は、UCS TransformationFormat 8の略、最近ではRHL系OSのFedraCoreがUTF-8を標準localeにしている。これは、Unicodeの1文字を1~3バイトで表す文字である。UTF-8では8ビット目を使用する、でも問題起こらない、多くのサーバが8ビット目も一応通るように出来てるらしい。Unicodeって1文字を2バイトもしくは4バイトの固定長で表す。そんでもって、これを変換して、みなさんご存じのアスキー文字を1バイトで扱えるようにしたものがUTF-8なのである。

④ ・・・・・ さて、これはBASE64で7ビット化された添付ファイルだ。
画像ファイルも音のファイルもバイナリ形式だ。冒頭に言ったように、これら全て7ビット化したテキストファイルに変換する。BASE64にかかればどんなファイルも7ビット化して64種類の文字で表されてしまう。


①X-SMTP-Result: 250 Ok: queued as 6E3CC11C061
①Date: Tue, 06 Dec 2005 16:51:28 +0900
①From: Taro Yamada<xxxx@xxxxxxxx.com>
①To: =?ISO-2022-JP?B?GyRCJGYkXxsoQg==?= <xxxx@xxxxxxx.com>
①Subject: =?ISO-2022-JP?B?GyRCJEEkZyRDJEghIkpZNi8bKEIoXl4bJE
IhNhsoQg==?=
①Message-Id: <20051206164928.3388.XXXX@xxxxxxx.com>
②MIME-Version: 1.0
X-Mailer: Becky! ver. 2.22.01 [ja]
②Content-Type: multipart/mixed; boundary=”——_43954287338502391008_MUL
TIPART_MIXED_”
②Content-Transfer-Encoding: 7bit

——–_43954287338502391008_MULTIPART_MIXED_
Content-Type: text/plain; charset=”ISO-2022-JP”
Content-Transfer-Encoding: 7bit

$BE:IU;qNA$r;2>H!#(B


——–_43954287338502391008_MULTIPART_MIXED_
Content-Type: application/octet-stream;
name=”ftp_protocol.txt”
Content-Disposition: attachment;
filename=”ftp_protocol.txt”
Content-Transfer-Encoding: base64

④↓
guSC3YFBgqiCwoKpguqCpYFgKF5egVUNCg0KgsKCqYLqgsSC6YK+guuCp
IKvgse
Cp4FggUWgUWBRYFFgUINCg0KguSC3YFBj62CtYm0gsaI6o+PgsmV
14utgreCwY
KpgUINCop5gsiOcJgsWJtILMmGKVt4KigsSCrYLqguaBQoNSg
VuDcYFbiPmC3YLIgqqC54LFguCXx4KigqmC54KzgUINCoK7gsyR44LtguiJt
ILJguCI6pR0k/yC6oLEgq2C6oLmgWmPzoFqgUINCg0KgaEgRlRQksqQTYL
MkVOCxA0KDQqOSYrWjFeCzI6WgsWNxYLgi0OC8JV0gq+CyIKvguqCzoKig
q+CyIKigrGCxoLJgXWOdoKigrGC3YF2gsaMvoKkgrGCxoKqgqCC6YFCDQq
X4YKmgs6BQUZUUJLKkE2C8IK3gumCxoKrGC5ILgs2Cx4LMg3yBW4Nngv
CKSoKvgsaCr4LOl8eCooLGjnaCpIFIDQqVgZLKgrOBQUZUUI5JgsxQb3JM
jCCxjIxgvCKSoKvgsSCqIKvgs5GVFCSypBNj2+XiILpgsaOdoKkguaCyIFCg
sWC4IFBiOGCpILxgr6CyIFBDQqCsYLqgqqC3IK9gUWBRYFFgUWBQg0Kgr
GC6oKpgueBQZhigreC6YKpgueXx4KtjKmxIKtguqCyIFCgruC6oLFgUGCsY
LqgqmC54m0gsaI6o+PgsmDdoONg2eDUoOLgsGCxA0Kk3qCzI/ajdeCyYLC
gqKCxJedifCCtYLEgqKCsYKkguaBQo+tgrWCuILCgsWXx4KigqmC54Kzgp+
BYIFCib2CxoLIgq2CxZfHgqKCqQ0KgueXnYnwgrWCxIKygueC8YFCgrOCxI
5ugt+C6YLIgUKTWZV0gsyJtILMj5GCooK9iZiCopB9gvCMqYLEgq2C6oFpj8
6BaoFCDQoNCg0KDQoNCg0KDQpGVFCCyYLNgUYNg2WDQoN1g4KBW4N
ogsaDcINig1aDdYOCgVuDaIKql0yC6YLMgs2SbYLBgsSC6YLmgsiBQg0Kg
lCaiCDQYNOg2WDQoN1g4KBW4NoDQqVgZLKgsxGVFCDToOJg0ODQYOT
g2eCxkZUUINUgVuDb4rVFCSypBNgsyCsYLGgUINCg0KglGBaoNwg2KDV
oN1g4KBW4NoDQqCsYLqgs2BQVdlYoN1gRYNgqpGVFCTXZGXgsmOZ4LB
gsSC6YLMgqqDcINig1aDdYOCgVuDaILFl0yC6YKxgsaCqpG9gqKBQgDQqC
voKpgueBQYKxgsyDQYNOg2WDQoN1g4KBW4NogsaDcINig1aDdYOCgVuD
aILJgsKCooL1mdILMkH2CyYK1gr2CqoLBgsSQ4Ja+greC6YFCDQqC3IK4g
UGMvoLBgsSCqIKtgq+Cx4FBg06DiYNg0GDk4NngsaOSYLNl7yO0oLGguB
Qb3J0MjCCxjIxgsWSypBNgreC6YLtgq+CxYLNgsiCooFCDQqToOJg0ODQ
YOTg2eCzYFBUG9ydDEwMjSIyI1+gUEyMDAwgsaCqTMwMDCCxoKpgsyD
fIFbg2eCiNOCyY5ngqSBQoKxguqCzYFBaHR0cA0Kg3aDjYNng1KDi4LIgse
C4JOvgraCyILxgr6C5oFCDQqC3IK4gUGDQYNOg2WDQoN1g4KBW4NoguC
DcINig1aDdYOCgVuDaILgkKeM5INSg2yDToNWg4eDkgrWCxJCnjOSDUoN
9g5ODaILMguKC6I7mguiC8A0KgreC6YFCgrGC6oLNgUGDQYNOg2WDQoN
1g

省略

——–_43954287338502391008_MULTIPART_MIXED_
Content-Type: image/jpeg;
name=”ftp.jpg”
Content-Disposition: attachment;
filename=”ftp.jpg”
Content-Transfer-Encoding: base64

④↓
/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAUDBAQEAwUEBAQFBQU
GBwwIBwcHBw8LCERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBwe
Hx7/2wBDAQUFBQcGBw4ICA4eFBHheHh4eHh4eHh4eHh4eHh4eHh4eH
h4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAJZAIAAhEBAxEB
/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtR
AAAgQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fA
kM2JyggkKFhcYGRolJicooY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZW
ZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmjpmp6ipqrKztLW2t7i5usL
DxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAA
wEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQ
DBAcFBAQAAQJBSBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRCh
YkNOEl8RcYGRomJygpKjU2Nzg5OkNERSU1RVVldYWVpjZGVmZ2hpan
N0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tuLm6w
sPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBA
AIRAxEAPwD7oAKKKKACims+Gxik3+1AD6KYZAOo5o8znoaAH0UwvjqK
PMHYZoAfRSI24ZpaACimGQDr64pV
f6ikY4GaaZAOxoAfRTPM/2ePrQJ
MgHHFAD6KRTkA00Pk8jAz60APoopGOBmgBaKZ5g9P1pytuU1nwSMU
nmc9OKAH0UwSAkDHWn0AFFFFABRRRQAUUUUAFFFFABRRRQAU
UUUAFFFUUFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQB8wft3P

省略

——–_43954287338502391008_MULTIPART_MIXED_–


3.そんじゃ、電子メールは何故7ビットで表さなければならないのか?

そんじゃ電子メールは何で7ビットで全て表せなければならないんだろ?
調べたけど、何処にも的確な説明が無い。ただ、俺の勝手な考えだが・・・・・・・・・・・・。
1バイトって8ビットとは限らないってこと知っていたかな。あくまでバイトっていうのは「基本単位」のことであって、1バイトを何ビットと定義するかによって変わってくる。ちなみに、JISコードでは 1バイトを7ビットと定義してる。だから、ここから来てるんじゃ無いだろうかなって、俺は思った。


4.意外に知らないヘッダーフィールド

ヘッダーフィールド名意味
Ccメールの本来的なものに従属した関係各所宛へのメールアドレス。カーボン・コピーの略
BccToの宛先に指定した自分に知られず、メールの本来的なものに従属した関係各所宛へのメールアドレス。ビハインド・カーボン・コピーの略
Reply-To返信するときに使うメールアドレス。
In-Reply-ToどのMessage-IDのメール宛に来た返事なのかを表す。
Refarencesメールのやりとりの履歴
Receivedメールの転送経路情報
Return-Pathメル鯖が付ける返信先アドレス
Senderメールの送信者。メーリングリストなどで、メーリングリストから配信の場合は直接のメールの送信元であるメーリングリストの投稿先アドレス。
X-ML-Nameメーリングリスト名
X-Mail-Countメーリングリストの投稿メールの連番
X-ML-Serverメーリングリスト鯖のバージョン。

 


5.Freeメールからのメールに対してメールヘッダーから差出人を特定する

世の中、迷惑メールが後を絶たない。そこで、hotmail等のFreeメールからの迷惑メールを解析して、差出人を特定する方法を伝授する。

これから説明するのは、差出人 xxxxxxx@hotmail.co.jp から hoge@xxxxxxx.net 宛への迷惑メールのヘッダー情報である。

Received: from bay0-omc3-s33.bay0.hotmail.com (bay0-omc3-s33.bay0.hotmail.com [65.54.246.233])
by mx0.xxxxxxx.net (8.13.8/8.13.6) with ESMTP id m5G1kcDX046742
for <hoge@xxxxxxx.net>; Mon, 16 Jun 2008 10:46:39 +0900 (JST)
         ↑※1 本当の宛先メールアドレス

(envelope-from xxxxxxx@hotmail.co.jp)
Received: from BAY123-W43 ([207.46.11.78]) by bay0-omc3-s33.bay0.hotmail.com with Microsoft SMTPSVC(6.0.3790.3959);
Sun, 15 Jun 2008 18:46:34 -0700
Message-ID: <BAY123-W4377C4E07E1B0FF49FA16FB8A90@phx.gbl>
Content-Type: multipart/alternative;
boundary=”_fe0ab376-1828-49e5-96df-7dc4dd44ae74_”
X-Originating-IP: [xxx.xxx.xxx.xxx] ←※2 ここが差出人のゲートウェイアドレスを示している

From: <xxxxxxx@hotmail.co.jp>

To: <xxxxxxx@hotmail.co.jp> ←※3 宛先を差出人にして偽造している

Subject: =?iso-2022-jp?B?GyRCJEokaiQ5JF4kNyVhITwlaxsoQg==?=
Date: Mon, 16 Jun 2008 10:46:34 +0900
Importance: Normal
MIME-Version: 1.0
X-OriginalArrivalTime: 16 Jun 2008 01:46:34.0973 (UTC) FILETIME=[CF2670D0:01C8CF52]
X-UIDL: M,O”!N,d!!7Rf”!4E+”!

まず、このメールで言えるのは、Toの宛先をFromの差出人アドレス表示にして宛先を偽造しているが、ビビルほど難しい事ではないBCC(BCCとは、4項を参照)を使って表に宛先を出していないだけである。※3が宛先を差出人に偽造して表示している。※1が本当の宛先メールアドレスだ。

さらに、このメールはhotmailのアカウントを使って差出人を偽造している。しかし、※2に差出人のプロバイダのゲートウェイアドレスが解る。このアドレスからDNSの逆引きを行えばホスト名が解るだろう。それにより、旨くいけば差出人のプロバイダ名が解るはずである。
ただし、プロバイダではなく、個人で構築したサーバで逆引き設定してないものやダイナミックDNSで構築したサーバには、この方法は使えない。

いくら、メーラーで偽造工作をしても、ヘッダー情報はごまかせないので悪人を特定する場合には有効である。

以上

コメント