【Goで学ぶコンピューターサイエンス】メールの仕組み

## **メールの流れ**

メールの送信から受信までの流れは、以下のステップで構成されています。

1. **メールの作成と送信**  
   ユーザーがメールアプリやウェブメールを使ってメールを作成し、送信ボタンを押します。

2. **送信サーバー（SMTPサーバー）による処理**  
   メールは、送信側のSMTP（Simple Mail Transfer Protocol）サーバーに送られます。

3. **ドメイン名を基に受信サーバーを特定**  
   送信サーバーがDNSを利用して、メールアドレスのドメインに対応する受信サーバーを見つけます。

4. **メールの転送**  
   送信サーバーが受信サーバーにメールを転送します。

5. **受信サーバー（POP/IMAPサーバー）に保存**  
   メールは受信サーバーに保存され、受信者がアクセスできる状態になります。

6. **受信者によるメールの取得**  
   受信者がメールクライアントを通じてPOPまたはIMAPを使ってメールを取得します。

## **メールの送受信に使われる主なプロトコル**

### **SMTP（Simple Mail Transfer Protocol）**
- **役割**
    - メールの送信や転送に使用されます
- **仕組み**
    - クライアントから送信サーバーへ、または送信サーバーから受信サーバーへメールを転送します
- **ポート番号**
    - 通常はポート25、587、または465（SSL/TLS）を使用します

### **POP3（Post Office Protocol）**
- **役割**
    - 受信者がサーバーからメールをダウンロードするためのプロトコルです
- **特徴**:
  - メールをローカルに保存します
  - サーバー上のメールは削除されることが一般的です
- **ポート番号**
    - 通常はポート110、または995（SSL/TLS）を使用します

### **IMAP（Internet Message Access Protocol）**
- **役割**
    - サーバー上でメールを管理し、複数デバイスで同期可能にします
- **特徴**
    - メールはサーバー上に残ります
    - スマートフォンやPCなど、複数デバイスで同じメールボックスを利用できます
- **ポート番号**
    - 通常はポート143、または993（SSL/TLS）を使用します

## **メール送受信の安全性を高める技術**

### **1. 暗号化**
#### TLS（Transport Layer Security）
- 通信内容を暗号化して第三者による傍受を防ぎます
- SMTP、POP3、IMAPで対応可能です

### **2. 認証**

#### **SPF（Sender Policy Framework）**
SPFは、送信者のドメインが正当なメールサーバーから送信されたものであるかを検証するための仕組みです。

##### **仕組み**
1. ドメインのDNS設定に、どのメールサーバーからメールを送信するかを記述した **SPFレコード** を追加します
   - 例: `v=spf1 ip4:192.0.2.0/24 include:example.com ~all`
     - `v=spf1`: SPFバージョン1を示す
     - `ip4:192.0.2.0/24`: 指定されたIPアドレス範囲から送信されたメールを許可
     - `include:example.com`: 他のドメインのSPF設定を参照
     - `~all`: これ以外のメールは「ソフトフェイル」（弱い拒否）扱い

2. 受信サーバーが、送信元IPアドレスとSPFレコードを照合します
   - 一致すれば正当と見なし、不一致ならスパムメールや詐欺メールの可能性が高いと判断します

##### **メリット**
- なりすましメール（スプーフィング）の防止
- ドメインの信頼性向上

#### **DKIM（DomainKeys Identified Mail）**
DKIMは、電子署名を用いてメールの送信者の正当性とメール内容の改ざん防止を検証する仕組みです。

##### **仕組み**
1. 送信サーバーがメールに電子署名を追加
    - 署名は、送信元ドメインが保有する秘密鍵を使って生成されます

2. DNSに公開鍵（**DKIMレコード**）を公開
   - 例: `default._domainkey.example.com` に以下のような公開鍵が登録される
     ```
     v=DKIM1; k=rsa; p=MIGfMA0GCSqG...
     ```

3. 受信サーバーが署名を検証
   - メールに付加された署名を元に、DNSから公開鍵を取得し、署名の整合性をチェックします
   - 正当であれば、送信者がそのドメインに属する正規のメールサーバーであることが確認されます

##### **メリット**
- メール内容の改ざんを防止
- 送信者の信頼性を証明

#### **DMARC（Domain-based Message Authentication, Reporting, and Conformance）**
DMARCは、SPFとDKIMを組み合わせて、送信者のドメインを厳密に検証し、メールの処理方法を指示するための仕組みです。

##### **仕組み**
1. ドメインのDNSに **DMARCポリシー** を追加
   - 例: `_dmarc.example.com`
     ```
     v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com
     ```
     - `v=DMARC1`: DMARCのバージョン
     - `p=quarantine`: SPFやDKIMが失敗したメールを隔離
       - 他に `none`（無視）、`reject`（拒否）も指定可能
     - `rua=mailto:dmarc-reports@example.com`: 検証結果のレポート送信先

2. SPFやDKIMの検証結果を元に、メールを処理
   - SPFまたはDKIMのいずれかが失敗し、ポリシーに従わない場合、メールを隔離または拒否します

3. メール検証結果のレポートを送信
   - メールの検証状況を管理者に通知します

#### **メリット**
- SPFとDKIMを統合して信頼性を向上
- フィッシングやスパムメールを強力に防止
- 検証結果のレポートで運用状況を把握可能

#### **SPF・DKIM・DMARCの関係**

1. **SPF**
   - 送信元IPアドレスの正当性を検証する
2. **DKIM**
   - メールの署名を使って内容が改ざんされていないか確認
3. **DMARC**:
   - SPFとDKIMを組み合わせて検証し、不正メールへの対応方針を明示

## **GoでSMTPを使ったメール送信サンプルコード**

以下は、Go言語でSMTPを使用してメールを送信するサンプルコードです。

```go
package main

import (
	"fmt"
	"net/smtp"
)

func main() {
	// SMTPサーバーの設定
	smtpHost := "smtp.gmail.com"
	smtpPort := "587"
	smtpUser := "ここに自分のGmailアカウント名@gmail.com"
	smtpPass := "ここにSMTP送信用パスワード"

	// 送信者と受信者のメールアドレス
	from := "ここに自分のGmailアカウント名@gmail.com"
	to := "ここに自分のGmailアカウント名@gmail.com"

	// メールの件名と本文
	subject := "【TEST】件名が入ります"
	body := "本文です。"

	// メールのメッセージ
	message := []byte("To: " + to + "\n" + "Subject: " + subject + "\n\n" + body)

	// SMTP認証情報
	auth := smtp.PlainAuth("", smtpUser, smtpPass, smtpHost)

	// メール送信
	err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, []string{to}, message)
	if err != nil {
		fmt.Println("エラー:", err)
		return
	}

	fmt.Println("送信成功!")
}
```

```
送信成功!
```