オルタナティブ・ブログ > プログラマー社長のブログ >

プログラミングでメシが食えるか!?

メールの添付ファイル

»

昨日に引き続き、メールデータの話題です。

メールは本文だけでも形式が様々で、なかなか扱うのが大変なのですが、添付ファイルがあるとさらに複雑になります。

添付ファイルを1つつけたメールのデータを見てみましょう。
20110317_194131


Received: from komata-MacBook-Air.it.ncad.co.jp (komata-MacBook-Air.it.ncad.co.jp [192.168.0.145])
        by mailproxy.ncad.co.jp (NCAD MailProxy) with SMTP id 31043-1300358265
        for komata@ncad.co.jp; Thu, 17 Mar 2011 19:37:46 +0900
From: =?iso-2022-jp?B?GyRCPi5LcxsoQiAbJEI4d0c3GyhC?= <komata@ncad.co.jp>
Content-Type: multipart/mixed; boundary=Apple-Mail-43--71481315
Subject: =?iso-2022-jp?B?GyRCRTpJVSVVJSElJCVrSVUkLSROJWEhPCVrGyhC?=
Date: Thu, 17 Mar 2011 19:37:45 +0900
Message-Id: <4DFF47A9-D5EB-46FD-A7C7-E66CD5F00836@ncad.co.jp>
To: =?iso-2022-jp?B?GyRCPi5LcxsoQiBQGyRCPi5LcxsoQg==?= <komata@ncad.co.jp>
Mime-Version: 1.0 (Apple Message framework v1082)
X-Mailer: Apple Mail (2.1082)


まず、ヘッダのContent-Typeが「multipart/mixed」となっていて、boundary(区切り文字列)が指定されています。
添付ファイルが一つだけついたメールもないことはないのですが、大抵は本文と添付ファイルがいくつかつく、という感じです。


--Apple-Mail-43--71481315
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
        charset=iso-2022-jp

BE:IU%U%!%$%kIU$-$N%a!<%k!*

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
B>.Ks8wG7(Mitsuyuki Komata)
BF|K\%7!<!&%(!<!&%G%#!<3t<02q<R
  TEL:03-3565-3011(BD>!K!&2011B!JBe!K  FAX:03-3565-3611
E-Mail: komata@ncad.co.jp
Office-URL: http://www.ncad.co.jp/
Blog-URL:http://blogs.itmedia.co.jp/komata/
Private-URL: http://www.ncad.co.jp/~komata/
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

ここまでが本文です。boundaryで指定した区切り文字でパートが区切られます。


--Apple-Mail-43--71481315
Content-Disposition: attachment;
        filename*0*=iso-2022-jp''%1B%24B%24H%24C%24F%24b%24H%24C%24F%24bD9%21A%21A%21A%21A%21A%21A%21A%21A%24%24%25U%25%21%25%24%25kL%3E%1B%28B%2Dlong%2Dlong%2Dl;
        filename*1*=ong%2Dfilename%2D%1B%24B%25F%259%25HMQ%1B%28B.bin
Content-Type: application/macbinary;
        x-unix-mode=0644;
        name="=?iso-2022-jp?B?GyRCJEgkQyRGJGIkSCRDJEYkYkQ5IUEhQSFBIUEhQSFBGyhC?=
=?iso-2022-jp?B?GyRCIUEhQSQkJVUlISUkJWtMPhsoQi1sb25nLWxvbmctbG9u?=
=?iso-2022-jp?B?Zy1maWxlbmFtZS0bJEIlRiU5JUhNURsoQi5iaW4=?="
Content-Transfer-Encoding: base64

Xy9fL18vXy9fL18vXy9fL18vXy9fL18vXy9fL18vXy9fL18vXy9fL18vXy9fL18vXy9fL18vXy9f
L18vXy9fLwrlsI/kv6PlhYnkuYsoTWl0c3V5dWtpIEtvbWF0YSkK5pel5pys44K344O844O744Ko
44O844O744OH44Kj44O85qCq5byP5Lya56S+ClRFTDowMy0zNTY1LTMwMTEo55u077yJ44O7MjAx
Me+8iOS7o++8iSAgRkFYOjAzLTM1NjUtMzYxMQpFLU1haWw6IGtvbWF0YUBuY2FkLmNvLmpwCk9m
ZmljZS1VUkw6IGh0dHA6Ly93d3cubmNhZC5jby5qcC8KQmxvZy1VUkw6aHR0cDovL2Jsb2dzLml0
bWVkaWEuY28uanAva29tYXRhLwpQcml2YXRlLVVSTDogaHR0cDovL3d3dy5uY2FkLmNvLmpwL35r
b21hdGEvCl8vXy9fL18vXy9fL18vXy9fL18vXy9fL18vXy9fL18vXy9fL18vXy9fL18vXy9fL18v
Xy9fL18vXy9fL18vXy8K

--Apple-Mail-43--71481315--
.


添付ファイル部分です。わざと長いファイル名「とってもとっても長〜〜〜〜〜〜〜〜いファイル名-long-long-long-filename-テスト用.bin」にしてみましたので、Content-Dispositionのfilenameと、Content-Typeのnameが長くなっています。例によって漢字コードなどは7ビットに収まるようにエンコードされますが、エンコード形式がまた様々です。MacOSXのMail.appでは、Content-DispositionのfilenameはRFC2231形式でエンコードされていますが、Content-TypeのnameはBASE64でエンコードされています。添付ファイルの内容は、Content-Transfer-Encodeingにbase64と書かれていますので、BASE64エンコーディングです。ちなみにこの添付ファイルは実はテキストデータで、拡張子をわざと「.bin」にしてみたら、BASE64エンコードされたのですが、「.txt」だと、

--Apple-Mail-42--71565704
Content-Disposition: attachment;
        filename*0*=iso-2022-jp''%1B%24B%24H%24C%24F%24b%24H%24C%24F%24bD9%21A%21A%21A%21A%21A%21A%21A%21A%24%24%25U%25%21%25%24%25kL%3E%1B%28B%2Dlong%2Dlong%2Dl;
        filename*1*=ong%2Dfilename%2D%1B%24B%25F%259%25HMQ%1B%28B.txt
Content-Type: text/plain;
        x-unix-mode=0644;
        name="=?iso-2022-jp?B?GyRCJEgkQyRGJGIkSCRDJEYkYkQ5IUEhQSFBIUEhQSFBGyhC?=
=?iso-2022-jp?B?GyRCIUEhQSQkJVUlISUkJWtMPhsoQi1sb25nLWxvbmctbG9u?=
=?iso-2022-jp?B?Zy1maWxlbmFtZS0bJEIlRiU5JUhNURsoQi50eHQ=?="
Content-Transfer-Encoding: quoted-printable

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
=E5=B0=8F=E4=BF=A3=E5=85=89=E4=B9=8B(Mitsuyuki Komata)
=E6=97=A5=E6=9C=AC=E3=82=B7=E3=83=BC=E3=83=BB=E3=82=A8=E3=83=BC=E3=83=BB=E3=
=83=87=E3=82=A3=E3=83=BC=E6=A0=AA=E5=BC=8F=E4=BC=9A=E7=A4=BE
TEL:03-3565-3011(=E7=9B=B4=EF=BC=89=E3=83=BB2011=EF=BC=88=E4=BB=A3=EF=BC=89=
  FAX:03-3565-3611
E-Mail: komata@ncad.co.jp
Office-URL: http://www.ncad.co.jp/
Blog-URL:http://blogs.itmedia.co.jp/komata/
Private-URL: http://www.ncad.co.jp/~komata/
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

--Apple-Mail-42--71565704--
.

こんな感じに、quoted-printableになります。このあたりはメーラーによって違います。

さらに、本文が昨日書いたようなHTMLメール形式になると、プレーンテキストとHTML形式の本文があり、さらに添付ファイルが加わるのですが、マルチパートの出来方がメーラーによって違うこともあり、調べていると楽しいのですが、これらのデータを扱うプログラムを作ろうとすると頭を抱えたくなります。。

他にもS/MIMEで電子署名をつけると証明書データが添付されたり、さらに暗号化すると、本文全体が暗号化されてエンコードされたデータになったり、あるいはメールデータを添付すると入れ子になったりと、メールデータを扱うプログラムを作ろうとすると実に苦労することになります。

ということで、普段何気なく使っているメーラーやファイアーウォールなどのプログラムは、実は結構大変なことをやっていて、送信するときは自分の都合の良い形式で送ればいいのですが、受信したものを表示しようとすると、意外といろいろな形式に対応するなどして苦労して作られているのです。

こんな苦労をしながら、ある製品化を検討しているプログラムを作っているのでした。。

===

さて、余談ですが、今日は製品用のmicroSDが足りないということで、秋葉原に買い物に行ってきました。
S1
無事に、目的のメーカーのmicroSDのバルク品を10個GETできました!国内向け正規品と海外向けパッケージ品あるいはバルク品の売値は実に倍以上も違うのですから、秋葉原まで買いに行く価値があるというものです!

お店では、皆さん、乾電池や懐中電灯を探しているのに、私はなぜかmicroSDを10個もまとめ買いという、変わったお客だったのでした・・・。

S2
ついでに、我が家も単三・単四電池は大量にあるのですが、単一電池はあまり無いので、本当はエネループ用アダプタを買おうと思ったら、どこにもないので、とってもジャンキーなアダプターを見つけたので買ってみました。1個80円です。自作しようかと思っていたのですが、80円なら買う方が楽ですね。一応、お一人様4個まで、となっていました。。

被災地に比べれば、東京や自宅のある埼玉は恵まれている状態なのですが、それでも輪番停電はなかなか不便ですし、なにより通勤が大変です。JRはかなり動いているのですが、私鉄の遠方への列車はかなり時間帯が制限されています。川越はJR川越線、東上線、西武新宿線と、3路線もあるのに、ほぼいつでも使えるのはJR川越線のみで、私鉄はなかなか川越まで動いてくれません。帰りは3日連続でJRでした。今日は21時以降は西武新宿線が本川越まで行くようなので、それまで会社で仕事中です。東上線は22時以降でしょうか・・・。混んでいるし、各駅停車だけなので、恐ろしく時間もかかるし、実はかなり苦労しています。。毎日時間帯が異なるのも疲れる原因です。自宅でできる仕事は自宅にいた方が捗るのですが、ポツリポツリとお客さんとの打ち合わせや、会社でないとできない仕事もあり、まだ当分疲れそうです。

自宅は今(20時頃)、停電中のようで、子供たちは3階の窓に張り付いて、停電になる瞬間の街の様子をみようと、停電前から待ち構えていたようですが、まあ、何事もプラスに考えるという点で、見習うべきでしょうかねぇ。。

Comment(1)