Mailuで挑戦！メールサーバーをDockerでホストし、Gmailにメールを届けてみたい！（前編）

この記事は[ハウインターナショナル Advent Calendar 2024](https://qiita.com/advent-calendar/2024/haw)の4日目の記事です。

今回のテーマは、「**自前でメールサーバーをDockerでホストし、Gmailにメールを届けることができるか？**」という壮大な挑戦です。このテーマを選んだきっかけは、今年冒頭に話題になった「[神奈川県立高校のネット出願システムでメールが届かなかった](https://www.itmedia.co.jp/news/articles/2402/09/news114.html)」というニュースです。メールが届かないことで生じるトラブルを考えると、現代のメール配信の仕組みを正しく理解し、運用することの重要性がわかります。

この記事では、メール配信の技術や課題を解説しつつ、実際にメールサーバーを構築する過程を共有します。前後編に分けてお届けするこの記事の**前編**では、現代のメール配信の仕組みと、メールサーバーのセットアップに至るまでの工程を中心にお伝えします。

## 現代のメール配信とは？

メールを送信する仕組みは、インターネットの初期から利用されているプロトコルを基盤としています。その中心にあるのが、 **SMTP（Simple Mail Transfer Protocol）** です。

### SMTP: メールを「送信する」仕組み

SMTPは、メールを送信するためのプロトコルです。簡単に言えば、以下のような役割を果たします：

1. ユーザーがメールクライアント（例: GmailやOutlook）でメールを送信する。
2. メールクライアントはSMTPサーバーに接続し、送信先アドレスや本文などの情報を渡す。
3. SMTPサーバーがメールを受け取り、送信先のドメイン（例: example.com）を調べる。
4. そのドメインのメールサーバー（受信サーバー）にメールを転送する。

つまり、SMTPは「送り主」から「宛先」までメールを届ける郵便局のような役割を果たしています。ただし、SMTPはあくまで送信に特化しており、受信や保存には別のプロトコルが使われます。

### IMAP: メールを「受信する」仕組み

一方、受信されたメールを確認したり管理したりするためには  **IMAP（Internet Message Access Protocol）** が利用されます。IMAPは、メールを受信するだけでなく、メールサーバー上のメールを管理する機能も持っています。

IMAPの主な特徴は以下の通りです：

- メールがサーバーに保存されるため、複数のデバイスで同じメールボックスを同期可能。
- フォルダーやラベルを使ってメールを分類・整理できる。
- 一部のプロバイダではPOP3という別のプロトコルも使われていますが、IMAPの方が柔軟性が高く、現在の主流です。

つまり、SMTPが「送り主から受信サーバーまで」の役割を担う一方で、IMAPは「受信サーバーからユーザーのメールクライアントまで」を担っています。現代のメール環境では、この2つのプロトコルが密接に連携して動作しています。

### 現代のメール配信で求められる認証技術

メールの基本的な送受信の仕組みがわかったところで、次に重要なのが「**どうすればメールが正しく届くか**」という点です。単にSMTPでメールを送信するだけでは、相手の受信ボックスに届かない可能性があります。その理由は、スパムメールやフィッシング詐欺の防止策として、メールの信頼性を判断するための仕組みが追加されているからです。

以下の認証技術は、現代のメール配信には欠かせません：

1. **SPF (Sender Policy Framework)**
    
    送信元サーバーの正当性を証明するための仕組みで、送信者のドメインと送信サーバーのIPアドレスが一致するかどうかを確認します。
    
2. **DKIM (DomainKeys Identified Mail)**
    
    送信するメールにデジタル署名を付け、改ざんされていないことを証明します。
    
3. **DMARC (Domain-based Message Authentication, Reporting, and Conformance)**
    
    SPFとDKIMを組み合わせて、ドメインオーナーがメールの認証ポリシーを設定できる仕組みです。
    

これらを正しく設定することで、スパム判定を避け、Gmailのような厳しい受信ルールを持つプロバイダにメールを届けることが可能になります。

### IPアドレスのウォームアップ

さらに、新しいIPアドレスを使用する場合は、「**IPアドレスのウォームアップ**」と呼ばれる手順が必要です。これは、いきなり大量のメールを送信するとスパムと疑われるため、少量ずつ送信して信頼性を構築していくプロセスです。このあたりの手間は、メール配信の難しさを象徴しています。

これらを正しく設定し運用することで、単なるSMTPサーバーから一歩進んだ「届けられるメールサーバー」を構築することができます。

## ドメイン取得の苦労

メールサーバー構築の第一歩は、独自ドメインを取得することです。普段から個人でいくつかのドメインを所有・管理しているため、取得自体にはそれほど苦労しないだろうと思っていました。ただ、今回はせっかくの挑戦なので、いつもより少し制約を設けて選んでみることにしました。以下がその条件です：

### 絶対条件（MUST）

- **更新料が年間$10未満**コストを抑えたいので、高額なドメインは避けたいと考えました。
- **GMO系列でない**GMO系列のレジストラ（お名前.comなど）は登録が非常にスムーズで便利ですが、今回はあえて別の選択肢を探すことで、新しいサービスに触れてみたいという意図です。

### 推奨条件（RECOMMENDED）

- **日本円の支払いに対応している**為替レートの変動に影響されるのは避けたいので、可能であれば日本円で支払いができるところを優先しました。

### 候補に挙がった選択肢

最初に思いついたのは**Freenom**です。Freenomは`.tk`や`.cf`といったccTLDを無料で取得できるサービスとして有名でした。「無料なら、とりあえず試しに使ってみて、縛りに合致する他のドメインが見つからなければこれでもいいかな」と軽く考えていました。

しかし、実際にFreenomのサイトを訪れてみたものの、登録画面に進めません。「おかしいな？」と思い調べてみると、なんと**2024年現在、Freenomは新規ドメイン登録を停止している**とのことでした（参考：[Qiitaの記事](https://qiita.com/Brutus/items/6d7bf8c045023849ba94)）。

そこで仕切り直し、改めてじっくり調べてみました。いくつかのレジストラを比較した結果、**Cloudflare**で提供されている`.uk`ドメインが目に留まりました。**初年度も更新料も$5.22**というリーズナブルな価格で、為替の影響も比較的小さいと判断。条件にも合致していたので、最終的に「tsukaisute.uk」というドメインを取得することにしました。

思い描いていた簡単なドメイン取得とは少し違いましたが、条件に合う良いドメインにたどり着けました。

## VPSを用意してMailuをインストール

次に必要なのは、メールサーバーをホストする環境です。今回は[Time4VPS](https://www.time4vps.com/)で手頃なVPS（仮想プライベートサーバー）を1台借りることにしました。以下のスペックを持つVPSを用意しました：

- **CPU:** 1コア  
- **メモリ:** 2GB  
- **ストレージ:** 20GB SSD  

このVPSに、メールサーバーソフトウェアである **[Mailu](https://mailu.to/)** をインストールしました。MailuはDockerベースの軽量なメールサーバーで、次のような特徴を持っています：

- 必要最低限の機能が揃っており、手軽にセットアップ可能。  
- Webインターフェースが付属しており、ユーザー管理、メール管理が直感的で操作しやすい。  
- SMTPやIMAPの複雑な接続設定をDockerで隠蔽しているのでサーバー管理が楽。  

以下の手順でMailuをセットアップしました。

### Step 0: DNSの設定
Cloudflareでドメインを取得したので、外部からアクセス出来るようにDNSを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896055/68e26102-a97e-5a61-4a08-6e0bfa37e670.png)

### Step 1: VPS環境の準備
まず、VPSにDockerとDocker Composeをインストールし、mailuユーザーを作成し、dockerグループに入れます(文量が多くなるため、今回は割愛します)。
次にMailuの設定ファイルを生成します。

### Step 2: Mailuの設定ファイルを生成
Mailu公式の**セットアップウィザード**（[こちら](https://setup.mailu.io/2024.06/submit)）を使用して、設定ファイルを生成します。ウィザードで以下のような基本情報を入力します：

- ドメイン名（例: `tsukaisute.uk`）  
- 管理者メールアドレス（例: `admin@tsukaisute.uk`）  
- メールサーバーのホスト名（例: `mail.tsukaisute.uk`）  
- データ保存場所（例: `/home/mailu/storage`）  

ウィザードが生成したファイルをダウンロードし、VPSに配置します。

```bash
mkdir /home/mailu/storage
cd /home/mailu/storage
wget https://setup.mailu.io/2024.06/file/.../docker-compose.yml
wget https://setup.mailu.io/2024.06/file/.../mailu.env
```

### Step 3: 設定ファイルの確認
Mailuが提供する設定ファイルには、ウィザードで指定した内容が反映されていますが、念のため内容を確認します。

- `docker-compose.yml`は、Mailuを構成する各サービス（Webmail、IMAPサーバー、SMTPサーバーなど）の設定を記述しています。  
- `mailu.env`は、ドメインやホスト名、パスワードなどの設定を保持しています。

公式サイトも注意喚起しているように、「念のためダウンロードしたファイルに不審なコードが含まれていないか確認」するのは重要です。

### Step 4: Mailuの起動
設定を確認したら、Mailuを起動します。

```bash
cd /home/mailu/storage
docker compose -p mailu up -d
```

数分待つと、Mailuのサービスが起動します。次に、管理者アカウントを作成します。

### Step 5: 管理者アカウントの作成
Mailuを利用するには、最初に管理者アカウントを作成する必要があります。以下のコマンドで管理者アカウントを作成します。

```bash
docker compose -p mailu exec admin flask mailu admin admin tsukaisute.uk PASSWORD
```

上記のコマンドで`PASSWORD`を任意のパスワードに置き換えて実行してください。その後、Webブラウザで`http://mail.tsukaisute.uk`にアクセスし、管理者インターフェースにログインできます。

### Step 6: パスワードの変更
ログイン後は、管理インターフェースからパスワードを安全なものに変更します。「左メニューの"Update password"を選択し、設定を更新してください」。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896055/6f0bb77b-a33b-3db2-c53f-260e30b818e6.png)


これでMailuのセットアップは完了です！自分のドメインでメールを送信できる準備が整いました。ただし、ここからが本番です。次回は、Gmailに確実にメールを届けるためのSPF、DKIM、DMARCの設定や、IPアドレスのウォームアップについて解説します。

セットアップはスムーズに進み、数分でサーバーが稼働するようになりました。この時点で、自分のドメインからメールを送信できるようになりました。

## 次回予告：Gmailにメールを届ける挑戦

次回の後編(12/11の記事)では、セットアップしたMailuサーバーをさらに最適化し、Gmailにメールを届けるための工夫を紹介します。特に、SPF、DKIM、DMARCの設定やIPアドレスのウォームアップ、実際にGmailからの応答を確認する過程について詳しく解説します。

明日は@torifukukaiyouさんの「テディベア効果で仕事を加速！プログラマーの生産性を高める心理トリック 〜 ぬいぐるみを持っていない人も安心！Qiitaアドベントカレンダー2024の完走賞で「Qiitan」をゲットしよう！〜」です。お楽しみに！