メールの仕組みをまとめてみた


初期の電子メール

送受信間でTCPコネクションを確立し電子メールを配送していた。
下図のようにインターネットが繋がっていないと送受信ができない。

現在の電子メール

電源を切らないメールサーバを経由する。
また、メールの受信にPOPというプロトコルを使用する。

① メールソフトの設定に従い、メールサーバAにメールが送信される。
② DNSのMXレコードをひき、メールサーバBにメールを送信する。
③ メールソフトの設定に従い、メールサーバBからメールを受信する。

SMTP(Simple Mail Transger Protocol)

SMTPとは電子メールを送信するアプリケーションプロトコル。TCPのポート番号は25番。
SMTPは1つのTCPコネクションを確立して、メッセージの転送を行う。クライアントはテキストコマンドで要求を出し、サーバは3桁の数字で応答する。
コマンドや応答の最後には必ず改行(CR,LF)が付加される。

代表的なSMTPのコマンド

コマンド 内容
HELO 通信開始
EHLO 通信開始(拡張版HELO)
MAIL FROM:<reverse-path 送信者
RCPT TO: 受信者の指定(Receipt to)
DATA 電子メールの本文の送信
RSET 初期化
VRFY ユーザー名の確認
EXPN メーリングリスト名をユーザー名へ展開
NOOP 応答の要求(NO Operation)
QUIT 終了

代表的な応答コード

200番台は成功。
300番台はコマンドは受け入れられたが追加の情報を待っていることを表す。DATAコマンドへの応答に354が使われる。
400番台は一時的エラー。
500番台は永続的エラー。

応答コード 内容
211 システムの状態やHELPの応答
220 サービスの開始
221 サービスの終了
354 電子メールのデータの入力開始
421 サービスの提供ができないため、コネクションの終了
500 文法の誤り

POP(Post Office Protocol)

SMTPはメールを配送するプロトコルであるのに対し、POPはメールを受信するためのプロトコルである。SMTPのみだと受信側のコンピュータが初期の電子メールのように常時電源が入っていなければならない。

送信先からSMTPによって常時電源が入っているPOPサーバにメールが送られ、クライアントはPOPによってPOPサーバに保存されたメールを受信する。

POPもSMTP同様に1つのTCPコネクションを利用する。
コマンドはASCII文字列で表され、応答メッセージは正常を表す+OKとエラーを表す-ERRの二つしかない。

代表的なPOPのコマンド

コマンド 内容
USER name ユーザー名の送信
PASS string パスワードの送信
QUIT 通信終了
APOP name digest 認証
RETR msg メールのメッセージの取得

メールアドレスの仕組み

インターネットのメールアドレスは[email protected]のような形式である。
hogeが名前でexample.comが住所。この場合、hogeがメールを受信するコンピュータのホスト名かメール配送用のサブドメインで、example.comが組織名を表す。

DNS(Domain Name System)

電子メールの配送先の管理はDNSによって行われる。
DNSにはメールアドレスとそのメールアドレス宛のメールを送信すべきメールサーバのドメイン名を登録できる。これをMXレコードという。IN MX 10 mx1.example.comというような記述方法で設定されてい

例えばhoge.comのMXレコードにIN MX 10 mx1.hoge.comを指定すると、hoge.comで終わるメールアドレス宛のメールは全てmx1.hoge.comに転送される。

1つのメールアドレスに複数のサーバが指定されているときMXレコードに記されている数字が小さいものを優先して送信する。

MXレコードがIN MX 10 mx1.hoge.com, IN MX 20 mx2.hoge.comのとき
10の方が小さいのでmx1.hoge.comに優先して送られる。mx1.hoge.comに送信できなかったときmx2.hoge.comに送信される

MIME(Multipurpose Internet Mail Extensions)

Webサーバとブラウザの間でやり取りされるデータのファイル形式。
ヘッダ+本文(データ)の2つから成る。
ヘッダと本文は空行で区別される。
MIMEヘッダのContent-TypeMultipart/Mixedを指定し、boundary =の後に書いた文字列で区切ると1つのMIMEメッセージをMIMEメッセージとして定義できる。これをマルチパートと呼ぶ。Content-Typeはヘッダに続く情報がどのような種類のデータなのかを示す。

MIMEの代表的なContent-Type

Content-Type ファイル種類
text/plain テキスト
message/rfc822 MIMEと本文
multipart/mixed マルチパート
application/postscript PostScript
application/octet-stream バイナリファイル
image/gif GIF
image/jpeg JPEG
audio/mpeg MP3
video/mpeg MPEG
message/external-body 外部にメッセージがある
application/pdf PDF

その他はhttps://www.iana.org/assignments/media-types/media-types.xhtml を参照

MIMEの書き方

簡単な例

以下の例が最もシンプルな例である。
FromからContent-Typeの行までがヘッダで、その後に空行があり、本文がある。
本文とヘッダの間には必ず空行を入れる。

From: [email protected]
To: [email protected]
Subject: This is a MIME message
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP

ハロー MIME!

再帰的な構造

Content-TypeにMultipart/Mixedを指定する。
boundary =の後に区切り文字を設定する。

以下の場合だとSample-Boundaryが区切り文字。
--Sample-Boundaryを境界として入力し、最後にはマルチパートの最後を表す--Sample-Boundary--がある。

From: [email protected]
To: [email protected]
Subject: This is a MIME message
MIME-Version: 1.0
Content-Type: Multipart/Mixed; boundary = Sample-Boundary
Content-Transfer-Encoding: 7bit

ハロー MIME!

--Sample-Boundary           ← 境界
Content-Type: Text/Plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

Hello, MIME!

--Sample-Boundary           ← 境界
Content-Type: Text/Plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

はろー MIME!

--Sample-Boundary--         ← 最後の境界

IMAP(Internet Message Access Protocol)

IMAPはPOPと同様、メッセージを受信するためのプロトコルである。
POPは電子メールの管理をクライアント側で行うのに対し、IMAPはサーバ側で管理する。
外出先でもスマートフォンやタブレットで自宅のパソコンと同じようにメールの確認ができる。

POP VS IMAP

POP

メリット

パソコン等に保存したメールの削除・移動等を素早く処理でき、端末の容量が許す限りメールを保存できる。

デメリット

複数のパソコン等でのメール利用は使い勝手が悪い場合があります。また、同時に複数台の端末で受信を行うことができない

IMAP

メリット

サーバ上でメールを管理するので複数の端末での利用に優れている。複数の添付ファイルがあるときどれか一つを受信するといったことができる。

デメリット

メールサーバーの容量制限に達した場合、不用なメールをサーバ上から削除しなければ、新規に送られたメールを閲覧することができなくなる。

実践

Telnet

telnetコマンドは基本的に以下のような書式である。

telnet ホスト名 ポート番号

例えば

telnet localhost 25

現在telnetは推奨されておらず、SSHの使用が推奨されている。

MXレコードを検索する

digコマンドはDNSサーバに問い合わせることで、ドメイン名からIPアドレスを調べるコマンド。(逆も可能)
MXレコードを引いてGmailのメールサーバを調べてみる。

% dig gmail.com mx +short
30 alt3.gmail-smtp-in.l.google.com.
10 alt1.gmail-smtp-in.l.google.com.
20 alt2.gmail-smtp-in.l.google.com.
5 gmail-smtp-in.l.google.com.
40 alt4.gmail-smtp-in.l.google.com.