ダメ人間オンライン

あまり信用しないほうがいい技術メモとか備忘録とかその他雑記

メールとバウンダリの関係

日常的に使われている電子メールですが、メーラを使用せずにSMTPコマンドでHTMLメールや携帯電話宛のメールを送るとなると知っておかなければならない壁があります。



例えば、画像を送信する時にはBase64エンコードしなければならないとか、MIMEマルチパートを知っていなければならないとか。



その中でも今回はそのMIMEマルチパートについて軽く触れたいと思います。





MIMEマルチパートとは

一通の電子メールに複数の異なる種類のデータを格納する方式です。



単純に言ってしまえば、MIMEマルチパートの仕様に沿ってメールデータを作成すればドキュメントを添付したりHTMLメールを送ることが可能になるというものです。



実際にどんな書き方をされているかという一例を下に記述します。




From: fromメールアドレス
To: 送り先メールアドレス
Subject: メールタイトル
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="boundary1"

    • boundary1

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

<テキストパート本文>

--boundary1
Content-Type: text/html; charset=iso-2022-jp
Content-Transfer-Encoding: quoted-printable

<HTMLパート本文>


--boundary1--




上記は単純なTEXTパート+HTMLパートのメールになります。



HTMLメールに対応しているメーラで受け取ればHTMLパートが表示され、

TEXTメールにしか対応していないメーラであればTEXTパートが表示されます。



まず始めにmultipartの種類を宣言しboundaryというものの名称を指定しています。



この場合ですと、--boundary1の記述ごとにそれぞれのパートを記述して最後に--boundary1--で閉じるという形になっています。



上記はContent-Type: multipart/alternative;の記述になっていますが、multipart/alternative以外にもいくつか種類がありますので良く目にするものについて簡単に説明します。



MIMEマルチパートの例


※以下の記述は下記のページを参考にさせていただいておりますm(_ _)m

http://www.geocities.co.jp/Hollywood/9752/mime.html

http://www.atmarkit.co.jp/fnetwork/rensai/netpro04/netpro01.html





  • multipart/alternative



    • 含まれるパートは同じ内容を示します。


    • 上の例のようにTEXTパート+HTMLパートのメールを送信したい時などに使用します。



  • multipart/mixed



    • 個々のパートはそれぞれ別のデータを示します。


    • メーラはそれらすべてを個別に、かつ任意に表示できればよい。



  • multipart/related



    • メッセージ同士がリンクしている。





個人的によく使うパターンとしてはこの3つの組み合わせがほとんど。



例えば


Content-Type: multipart/mixed; boundary="boundary1"

    • boundary1

Content-Type: multipart/related; boundary="boundary2"

    • boundary2

Content-Type: multipart/alternative; boundary="boundary3"

    • boundary3

Content-Type: text/plain; charset=Shift-JIS
Content-Transfer-Encoding: 8bit

<TEXTパート>

    • boundary3

Content-Type: text/html; charset=Shift-JIS
Content-Transfer-Encoding: quoted-printable

<HTMLパート>

    • boundary3--
    • boundary2

Content-Type: image/gif; name="image.gif"
Content-Disposition: inline; filename="image.gif"
Content-Id: <image@XXX.XXX>
Content-Transfer-Encoding: base64

<HTMLパートで利用する画像等をBase64エンコードした文字列>

    • boundary2--
    • boundary1--




こんな感じでそれぞれのパートをくくってやれば基本的には問題なし。



ただ、携帯向けにメール送信する場合はインラインファイルの種類とかで上記の記述では一筋縄にいかない場合もあるので要注意。





最後に


実際にメール送信する場合は文字のエンコードやこれ以外に気をつけないといけないことがたくさんありますが試行錯誤して理解していくのが一番の近道かと思います。



また、この記事内とかでも私の理解不足でおもいっきりウソ書いちゃってる可能性もありますので参考程度にしていただければとおもいます。