skillup

技術ブログ

サーバー・ネットワーク

メール送信に関して その2 メールメッセージのデータ形式

投稿日:

前回に引き続き、メールのメッセージ構造について書きたいと思います。

大まかな構造

メールメッセージの基本的な形式はRFC5322で規定され、大まかに分けるとヘッダ部とボディ部に分かれます。(今回添付ファイルが付いたケースは別とします。)

ヘッダ部

ヘッダ部はさらに下記のような要素に分かれます。

メールアドレス

読んで字のごとくです。

From/Sender/Reply-To

Fromはメッセージ作成者、Senderは送信者です。同一の場合、Senderは不必要です。

To/Cc/Bcc

そのままのいみです。厳密にいうとToと送信先が違うケースもありますが、ここでは省略します。

Date

メッセージの送信時刻です。

Message-Id/In-Reply-To/References

Message-Idはメッセージをユニークに識別する記号です。In-Reply-Toはメッセージに返信する際に付加されます。Referencesも近い概念ですが、直接の返信元だけでなく、返信を繰り返すたびに追加されていきます。

Subject

件名です。

ボディ部

こちらはメールの本文の情報になります。ボディ部も通常はASCII文字だけで構成されます。Unicode以前はASCII文字だけで構成されているISO-2022-JPというエンコーディングがあります。日本語だけで送る場合は今でもISO-2022-JPで送ることがい一般的です。

MIME

ASCII文字だけの場合は件名に日本語や送信者を記述できませんでしたし、バイナリデータを送ることもできませんでした。MIME規格が生まれたことで件名に日本語とバイナリデータを添付させることができるようになりました。

ヘッダ中の非ASCII文字

MIMEではASCII文字にエンコードすることでヘッダ中に非ASCII文字を入れることができます。=?UTF-8?B?5pel5・・などの文字はこのエンコーディングされた文字列を表しています。ただし、処理自体は複雑なため、技術者中瀬です。(私もこれで苦労したことが結構あります。)

Content-Transfer-Encoding

次はボディ部の変換になります。ISO-2022-JP以外はいずれも8bitデータであったり、テキストデータでないこともあるため、これらを変換するためにBase64とQuoted-Printableという規格が使われます。(ここではBase64のみに触れます。)

Base64

バイナリデータをテキストに変換します。Content-Transfer-Encoding:base64と指定します。

Content-Type

type/subjectの形式でボディ部のデータの種類を表します。


text/plain US-ASCIIテキスト
text/html HTMLテキスト
text/jpeg JPEG画像
など

8bitデータの扱い

SMTPは基本的に7bitのデータしか扱えませんが、拡張で8bitデータを扱うこともできます。

文字化け対策

メールが文字化けをする場合、下記のようなことが原因であることが多いです。

charasetが正しくない

テキストがsjisなのにContent-TypeにISO-2022-JPが含まれているなど。

charasetに含まれない文字を使用している

例えば半角カナ、〇囲み、カッコつき漢字など・

MIMEエンコーディング

=?UTF-8?B?5pel5・・の部分がダブルクオートでくくられていたりするとエンコーディングが正常に行われません。

参考リンク

SoftWareDesign 9月号
http://www.atmarkit.co.jp/ait/articles/0602/18/news009.html
http://i.loveruby.net/ja/projects/tmail/doc/basics.html
http://d.hatena.ne.jp/takami_hiroki/20110209/p1
http://e-mail.pc-beginner.net/mail/html_mail.html

-サーバー・ネットワーク
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

VPSのCentOS上にVirtualBox+Vagrantをインストール

普段使っているPCにVirtualBox+Vagrantをいれることはあったんですが、VPS上のCentOSに仮想環境を入れたいとの要件があり、試してみました。 結論からすると結局できなかったんですが …

no image

dockerインストール

ansibleに続いてdockerについて書いていこうと思います。 Contents1 dockerとは?1.1 インストール1.2 イメージ取得&コンテナ作成1.3 commit1.4 参考リンク …

no image

キャッシュについて(主にmemcachedを中心に)

Webサービスのパフォーマンス向上で目に見えて効果があることの一つがDBへのアクセス回数を減らすことです。 それはSQLを発行する回数を少なくするなど、普段からのプログラムの書き方ももちろん大事なので …

no image

herokuでMySQL

昨日に続き、heroku+MySQLのメモです。 herokuはディフォルトではPostgreSQLですが、アドオンを使うとMySQLも使えるようになります。 使い方ですが、herokuの管理画面でク …

no image

サーバーの過負荷の発見 メモリ使用率の調査&抽出、置換(awk,sed)コマンドについて

前回、サーバーの負荷調査について記事を書いたので、それに関するスクリプトを。 Contents1 仕様2 ソース3 解説3.1 freeコマンド3.2 awk3.3 sed 仕様 日付とメモリ使用率、 …