【図解】メールの仕組み

# はじめに
前々回に投稿した「[【図解】Webの仕組み]( https://qiita.com/gonzaemon/items/11d7837e8dbff0bb1d99 )」がありがたいことにたくさんの方からご好評をいただきました。
その中で、「メールの仕組み」も作って欲しいというお話があったので僭越ながら解説させていただきます。

# メールの送信・受信の流れ
![メールの仕組み (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063100/e490a380-fed0-454f-97f1-d5b96810d76a.png)


# 解説
### 1. メール送受信の基本的な流れ

![メールの仕組み (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063100/0560d4ec-3be2-4e5b-b577-ec06a5dd3517.png)

**メールアドレスの構造:**
メールアドレスは「名前@ドメイン」の形式で、インターネット上でメッセージの送受信先を特定するための住所です。例えば、taro@example.comの場合、「taro」が名前部分、「example.com」が住所（ドメイン）部分を表します。

**メール送信の開始:**
送信者（taro@example.com）がメールクライアントでメールを作成。
メールクライアントはSMTPプロトコルを使用して送信側メールサーバーにメールを送信。
この通信はSMTPプロトコルに基づいて行われ、送信者の認証や送信内容の転送が実行されます。

### 2. DNSによる宛先メールサーバーの特定

**DNSサーバーへの問い合わせ:**
送信側メールサーバーは宛先ドメイン（例：jiro@example.comのexample.com部分）のメールサーバーを特定する必要があります。
DNSサーバーに対して、宛先ドメインのMXレコード（Mail Exchange record）を問い合わせます。
DNSサーバーは該当ドメインのメールサーバーのIPアドレス（例：192.168.1.25）を返答します。

**IPアドレスの取得完了:**
取得したIPアドレスを使って、送信側メールサーバーは受信側メールサーバーへの接続準備が完了します。

### 3. SMTPによるメールの転送

![メールの仕組み (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063100/7863aea2-aa24-4d12-9ec6-e0dde96be3e2.png)

**【SMTPプロトコルの通信フロー】**
**接続確立:** 送信側メールサーバーが受信側メールサーバーに接続すると、受信側は「220」応答を返します
**クライアント識別:** 送信側は「EHLO」コマンドで自身を識別し、受信側は「250」で応答します
**送信者指定:** 「MAIL FROM:taro@example.com」コマンドで送信者を指定し、「250」で応答を受けます
**受信者指定:** 「RCPT TO:jiro@example.com」コマンドで受信者を指定し、「250」で応答を受けます
**メール本文送信:** 「DATA」コマンドでメール本文の送信を開始し、「354」で応答を受けます
**メール終了:** メール本文送信後、単独のドット「.」でメール終了を示し、「250」で送信成功の応答を受けます
**接続終了:** 「QUIT」コマンドで接続を終了し、「221」で応答を受けます

**【SMTPの特徴】**
メールを送信するためのアプリケーションプロトコル。
送信時に受信者がオンラインである必要がなく、メールサーバーが一時的に保管します。

### 4. POP/IMAPによるメールの受信
![メールの仕組み (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063100/f07d27ce-f482-4116-bc81-99e04bcb8ad7.png)


**【POP3プロトコルの通信フロー】**
**接続確立:** メールクライアントがメールサーバーに接続し、「+OK」応答を受けます
**ユーザー認証:** 「USER jiro」「PASS パスワード」コマンドで認証を行います
**メールボックス確認:**「STAT」コマンドでメールボックスの状態を確認します
**メール一覧取得:**「LIST」コマンドでメール一覧を取得します
**メール取得:** 「RETR 1」コマンドで特定のメールを取得します
**メール削除マーク:** 「DELE 1」コマンドで取得したメールに削除マークを付けます
**接続終了:** 「QUIT」コマンドで接続を終了し、削除マークの付いたメールが実際に削除されます

**【POP3とIMAPの違い】**

**POP3:** 単一デバイスでのメール利用に適しており、通信環境が限られている場合に効率的です。
**IMAP:** 複数デバイスでのメール利用に適しており、常に最新状態を同期したい場合に最適です。

### 5. メール拡張技術

**MIME (Multipurpose Internet Mail Extensions):**
電子メールでテキスト以外のデータ（画像、添付ファイルなど）を送受信するための標準規格。
メールヘッダーにContent-Typeを指定することで、様々な形式のコンテンツを扱うことができます。

### 6. メール通信の特徴とセキュリティ

**非同期通信:**
メール通信は非同期であり、送信者と受信者が同時にオンラインである必要がありません。メールサーバーが中継点となり、受信者がオンラインになるまでメッセージを保管します。

**プロトコルの連携:**
メール通信は複数のプロトコル（SMTP、DNS、POP/IMAP）が連携することで実現されています。
それぞれのプロトコルが送信、転送、受信という異なる役割を担っています。
このように、メールシステムは複数のプロトコルと技術が連携して機能する複雑なシステムですが、ユーザーにとっては「送信」と「受信」という単純な操作で利用できるよう設計されています。


# 余談 - メール通信における暗号化について
メール通信の基本的な仕組みをご理解いただいた上で、余談として少しだけ暗号化についてお話ししましょう。
### なぜメールの暗号化が必要なのか
通常のSMTPプロトコルでは、メッセージは平文で送信されるため、通信経路上の誰でも理論的には内容を読むことができてしまいます。これは1970年代にメールプロトコルが設計された当初、インターネットがまだ小規模な研究ネットワークだった時代の名残です。

メール暗号化の二つのアプローチ
1. 通信経路の暗号化 (TLS/SSL)
最も一般的に使われているのが、メールサーバー間やクライアント-サーバー間の通信を暗号化する方法です。

![メールの仕組み (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063100/f2ff4bd4-668a-46d4-8561-bc276e1560d3.png)

これは一時的な共通鍵によって**各通信区間のみ**暗号化と複合化が行われます。つまり、各メールサーバーでは内容を読むことが可能です。Gmailなどの大手プロバイダ間ではこの暗号化が標準で行われています。

2. エンドツーエンド暗号化 (S/MIME, PGP)
より高度なセキュリティが必要な場合は、メール本文自体を暗号化します。

![メールの仕組み (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4063100/feb308e9-dfb6-4677-9f80-c6321f8061e7.png)

これは**メッセージ本体**を暗号化します。つまり、途中の誰も（メールサーバーも含めて）内容を読むことができません。受信者の公開鍵によってメッセージは暗号化され、複合化には受信者だけが持っている秘密鍵が使われます。


### 面白い事実
暗号化されていないメールは、インターネット上で10〜15の異なるサーバーを経由することもあり、各ポイントで理論的には内容を読まれる可能性があります。

大手メールプロバイダが提供する「セキュアメール」機能でも、プロバイダ自身はメールの内容を読むことができます（広告表示などに利用されることも）。

エンドツーエンド暗号化を使うと、スパムフィルターなどの機能が使えなくなることがあります（サーバーがメール内容を分析できないため）。