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

# はじめに
この記事は[ハウインターナショナル Advent Calendar 2024](https://qiita.com/advent-calendar/2024/haw)の11日めの記事です(年明けになってしまってすみません)。  

前編では、メールサーバーをDockerでホストするための基本的なセットアップ手順を紹介しました。自分のドメインを取得し、VPS上にMailuをインストールするところまで進めましたが、ここからが本番です。実際にメールを送信する際に直面するのは、メールがスパムフォルダに振り分けられてしまう問題です。特に、Gmailのような厳格な受信ポリシーを持つメールサービスでは、適切な認証技術を実装しない限り、送信したメールが届かない可能性が高いのです。

後編では、Gmailにメールを確実に届けるために必要な設定を解説します。具体的には、
* SPF（Sender Policy Framework）
* DKIM（DomainKeys Identified Mail）
* DMARC（Domain-based Message Authentication, Reporting, and Conformance）

といった認証技術を利用して、送信するメールが正当なものであることを証明し、スパム判定を回避します。また、新しいIPアドレスを使用する場合には「IPアドレスのウォームアップ」を行う必要があり、この手順についても少し説明します。

さらに、メールが確実に届けられるためには、どれだけのメールをどのタイミングで送信すべきか、という「信頼性の構築」も重要な要素です。このような設定を行うことで、初めて自前のメールサーバーからGmailにメールを確実に届けることができるようになります。次回も引き続き、より深い技術的な内容に踏み込んでいきますので、最後までお付き合いください。

# SPF, DKIM, DMARCについて

前編では、メールサーバーをDocker上でセットアップし、基本的なメール送信の準備を整えました。今回は、Gmailなどの厳しい受信ルールを持つプロバイダにメールを届けるための、メール認証技術「SPF」「DKIM」「DMARC」の設定について解説します。これらの設定を正しく行うことで、メールがスパムフォルダに振り分けられるリスクを減らし、確実に受信ボックスに届けられるようになります。

### 1. SPF (Sender Policy Framework)

**SPF**は、送信元サーバーの正当性を証明するための仕組みです。具体的には、メールを送信しているサーバーのIPアドレスが、送信者のドメインで許可されているサーバーと一致するかどうかを確認します。これにより、第三者が偽のメールを送信しても、それをブロックできるようになります。

#### SPFレコードの設定方法

1. **Cloudflareの管理画面にログイン**し、「DNS」セクションに移動します。
2. 「DNSレコードの追加」をクリックし、「タイプ」で「TXT」を選択します。
3. 「名前」に「@」と入力し、「値」に以下のようなSPFレコードを入力します。

```
v=spf1 mx a:mail.tsukaisute.uk ~all
```

※ スクショでは`tsukaisute.uk`となっていますが、`@`を入力して保存すると補完されますので、「@」と入力してください。
`~all`は「他のサーバーから送信された場合、ソフトエラーとして扱う」という設定です。

設定後、DNSが反映されるまで数時間かかる場合があります。

![スクリーンショット 2025-01-06 164625.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896055/c814453f-0e29-f41f-437e-5938e400347e.png)

### 2. DKIM (DomainKeys Identified Mail)

**DKIM**は、送信されたメールにデジタル署名を付け、メールの改ざんが行われていないことを証明する技術です。これにより、受信者はメールが送信者のドメインから送られた正当なものであることを確認できます。

#### DKIMの設定方法

Mailuでは、DKIMの設定を自動で行う機能がありますが、手動で設定する方法を解説します。

1. **Mailuの管理画面にログイン**し、「Settings」セクションに移動します。
2. 「サービスドメイン」タブで、あなたのドメイン（例: tsukaisute.uk）を選択して、詳細を確認します。
![スクリーンショット 2025-01-06 165202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896055/e5f8015e-da5f-356b-49a1-574f0dafda49.png)

3. DKIMの署名を有効にするため、「鍵を(再)生成」をクリックします。
![IMG_20250106_180226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896055/b0a46169-5eb4-438c-1af4-74300f033dad.png)

4. Mailuが自動的に生成したDKIMの公開鍵を確認し、それをDNSに追加します。

DNSの設定は、以下のようになります：

- **名前**: `dkim._domainkey`
- **値**: Mailuが提供する公開鍵（`v=DKIM1; k=rsa; p=...`）

これで、メールが送信される際に自動的にDKIM署名が付与され、受信者側での確認が可能になります。

![IMG_20250106_180131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896055/a205c4da-1012-5902-a591-55122fe0eb40.png)


### 3. DMARC (Domain-based Message Authentication, Reporting, and Conformance)

**DMARC**は、SPFとDKIMを組み合わせて、ドメインオーナーがメール認証のポリシーを設定できる仕組みです。これにより、SPFやDKIMが失敗した場合にどう処理するかを定義できます。例えば、「受信者側でメッセージを拒否する」「スパムフォルダに振り分ける」などのアクションが可能です。

#### DMARCレコードの設定方法

1. **Cloudflareの管理画面にログイン**し、再び「DNS」セクションに移動します。
2. 「DNSレコードの追加」をクリックし、「タイプ」で「TXT」を選択します。
3. 「名前」に「_dmarc」と入力し、「値」に以下のようなDMARCレコードを入力します(実際はmailuで生成された値をそのまま使用します)。

```
v=DMARC1; p=reject; rua=mailto:admin@tsukaisute.uk
```

pの値は他にもあり、`p=none` は「ポリシーなし」で、レポートだけを受け取る設定です。ポリシーを厳しくしたい場合は、`p=quarantine`（スパムフォルダに振り分け）や`p=reject`（メールを拒否）に変更できます。`rua`には、DMARCレポートを受け取るメールアドレスを指定します。
![スクリーンショット 2025-01-06 171656.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896055/a2170b23-4dd2-8ccc-6211-0ebac769931c.png)


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

新しいIPアドレスから大量のメールを一度に送信すると、それがスパムとして扱われる可能性があります。そのため、「IPアドレスのウォームアップ」が必要です。このプロセスでは、最初は少量のメールを送信し、時間をかけて送信量を増やしていくことで、IPアドレスの信頼性を高めます。

# ウォームアップ(メールを送受信)

1. **最初の数日は、1日あたり数通のメールを送信**します。
2. その後、数日ごとに送信数を増加させていきます。最終的には、1日あたり数百通のメールを送信できるようになります。
3. メールを送信する際には、送信先を慎重に選び、信頼性のある受信者にのみ送信します。

...そのはずだったんですが、今回の設定では、立てたメールサーバーのSMTP (465ポート) やIMAP (993ポート) にアクセスできませんでした。Gmailからの送信は問題なく行えたのですが、メールサーバーからの送受信ができないという状態です。

調査した結果、mailuのDocker初期設定ではこれらのポートにアクセスする設定がうまくいかないことが分かりました。特に、Nginxの設定や、メールサーバーの設定ファイルでの上書き機能が適切に設定されていなかったため、これらの変更を加える必要がありました。ただ、時間が足りなかったため、今回のタイムアウトの原因を根本的に解決することはできませんでした。

# 振り返り

この問題を解決するには、まずNginxの設定を見直し、メールサーバーのSMTPおよびIMAPポートを適切に通す設定を行う必要があります。さらに、使用しているメールサーバーの設定ファイルで、必要なアクセス許可やプロトコルの設定を再確認することが重要です。加えて、ネットワークのセキュリティ設定や、ファイアウォールの設定が影響している可能性もあるので、これらをしっかり確認してから再度テストを行う予定です。

時間の都合ですべての設定を完了することはできませんでしたが、この経験を通して、次回は早めに問題を特定し、改善できるようにしたいと思います。

### おわりに

今回は、Gmailへの送信・受信がうまくいかないという問題に直面しましたが、問題の原因をある程度特定できたことが収穫です。最終的な解決には、Nginxや設定ファイルの調整が必要であることがわかりましたので、次回はそれを踏まえてさらに詳細な設定を行いたいと思います。

この問題を解決し、無事に送受信ができるようになることを楽しみにしています。次回の設定作業では、事前に確認を行い、よりスムーズに進められるようにしたいです。


次回は[Qiitaに投稿して賞を獲るコツを教えます──闘魂で切り開く未来](https://qiita.com/torifukukaiou/items/d8d4fa3cdf6672799f90)です。