Google Cloudでメールサーバー構築:Postfix + Dovecotで学ぶメールシステムの仕組み
1. はじめに
技術書やドキュメントを読み、なんとなく仕組みを理解したつもりになることはよくあります。しかし、いざ実際に実装する際やトラブルシューティングが必要になった際、その知識だけでは太刀打ちできないことに気づかされます。
私にとって、メールサーバーがまさにその一例で、 SMTPやDNSの名前は知識として知っていても、実際の通信フローまでは具体的にイメージできていませんでした。そこで、この「知っているつもり」状態を脱するために、Google Cloud上でゼロからメールサーバーを構築することにしました。
この記事では、教科書通りの理解が、実装を通じてどのように腹落ちしたのかを振り返ります。
2. 結論:実装を通じて得た知識(Before / After)
実装手順に入る前に、メールサーバー構築を通じて私の理解がどう変化したかを共有します。教科書的な知識と、実際に手を動かしてみて得た知識には大きな乖離がありました。
なお、メールサーバーの概要を掴む際には、以下のサイトを参考にしました。

2.1. SMTPは送信専用、POP3は受信専用ではない
- Before: SMTPはメールの送信、POP3はメールの受信専用だと思っていました。
- After: SMTPは手元のデバイスからサーバーへの送信だけでなく、メールサーバー間の送受信の役割も担っている。一方POP3は、サーバーのメールボックスに届いたメールを、手元のクライアントへ引き出す役割を持っている。

2.2. SMTPやIMAP/POP3はサーバーではなく通信方式
- Before: SMTPサーバーやIMAP/POP3サーバーという名称から、それぞれ独立したサーバーが存在するイメージを持っていました。
- After: SMTPやIMAP/POP3は単なる通信の規約(プロトコル)に過ぎない。一つのサーバーの中に、それぞれの役割を持ったソフトウェアが同居し、ポートを使い分けて待ち受けている。

2.3. 2段階の名前解決
- Before: DNSで名前解決を行う際には、Webサイトと同様に、ドメイン名をIPアドレスへ変換しているだけだと考えていました。
- After: メール送信においては、まず宛先メールアドレスのドメイン名に対してMXレコードを問い合わせて送信先ホスト名を特定し、次にそのホスト名に対してAレコードを問い合わせてIPアドレスを割り出す。この2段階のプロセスを経て、メールサーバーのIPアドレスが特定される。

3. 実装
今回はGoogle Cloud環境を用いてメールサーバーを構築しました。目標は、自作したメールサーバーを用いて実際にメールの受信を行うことです。
なお、今回の実装範囲について補足すると、 Gmailなど外部のメールアドレスから、このサーバー宛てにメールを送信したい場合、独自ドメインの取得とDNS設定(後述のステップ3.4)が必須となります。 一方で、サーバー内部で完結する動作確認(自分宛てに送って自分で受け取る)だけであれば、ドメインの取得やDNS設定は不要です。ご自身の学習目的に合わせて選択してください。
【構築手順】
3.1. インスタンス作成(Compute Engine)
3.2. SMTPサーバーの構築(Postfix)
3.3. POP3サーバーの構築(Dovecot)
3.4. DNS設定(オプション)
3.5. メールソフトでの確認(Thunderbird)
3.6.メールの送信
【使用した技術スタック】
サーバー: Compute Engine
OS: Debian GNU/Linux 12 (bookworm)
SMTP: Postfix
POP3: Dovecot
DNS: Cloud DNS

3.1. インスタンス作成(Compute Engine)
Google CloudサービスのCompute Engineを用いてVMインスタンスを作成します。
スペック:
・マシンタイプ: e2-small (2 vCPU, 1 コア, 2 GBメモリ)
・OS: Debian GNU/Linux 12 (bookworm)
・ディスク: バランス永続ディスク 30GB
Cloud Shellに以下のgcloudコマンドを入力することで、同様のインスタンスを作成可能です。
# 静的IPアドレスの予約
gcloud compute addresses create mail-server-ip --region=asia-northeast1
# インスタンスの作成
gcloud compute instances create mail-server \
--machine-type=e2-small \
--image-family=debian-12 \
--image-project=debian-cloud \
--boot-disk-size=30GB \
--boot-disk-type=pd-balanced \
--address=mail-server-ip \
--tags=mail-server \
--zone=asia-northeast1-aファイアウォールの設定
インスタンスを作成しただけでは、外部からの通信は遮断されています。 そこで、タグ機能を利用して、メール送受信に必要なポートを開放します。
- tcp:25 → SMTP
- tcp:110 → POP3
# ファイアウォールルールの作成
gcloud compute firewall-rules create allow-mail \
--direction=INGRESS \
--priority=1000 \
--network=default \
--action=ALLOW \
--rules=tcp:25,tcp:110 \
--source-ranges=0.0.0.0/0 \
--target-tags=mail-server3.2. SMTPサーバーの構築(Postfix)
オープンソースのMTA (Mail Transfer Agent)であるPostfixを用いてSMTPサーバーを構築します。作成したインスタンスにSSHで接続を行い、以下のコードを実行します。
1.Postfixのインストール
sudo su -
apt update
apt install postfix以下のような初期設定の画面が出てくるのでInternet Siteを選択します。その次のページではメールサーバー用のドメイン名を取得していればそのドメイン名を、取得していなければそのままOkを選択します。

2.設定ファイルの編集
メインの設定ファイルである /etc/postfix/main.cf を編集します。
vi /etc/postfix/main.cfviエディタ起動後に i キーを押すと入力モードに切り替わり、ファイルを編集できます。編集が終わったら Esc キーでコマンドモードに戻り、:wq と入力して Enter を押すことで保存して終了します。
変更内容(ドメイン名を取得している場合はexmaple.comを置き換えてください)
# 変更点
smtpd_banner = $myhostname ESMTP unknown
myhostname = mail.example.com
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
inet_protocols = ipv4
# 追加項目
mydomain = example.com
myorigin = $mydomain
home_mailbox = Maildir/保存したら正しく変更されているか確認を行います。postfix checkを実行し、エラーが表示されていなければOKです。
postfix check設定を反映させるためにPostfixを再起動し、自動起動も有効にしておきます。
sudo systemctl restart postfix
sudo systemctl enable postfix3.ユーザー作成
Postfixの設定でメールボックス形式を Maildir に指定しました。これを受け取るためのユーザーとディレクトリを用意します。
まず、テスト用のユーザーを作成します。
# ユーザーの作成
useradd testuser
# パスワードの設定
passwd testuser
--> 任意のパスワードを2回入力します続いて、このユーザーのホームディレクトリ内に、メールを保管するためのフォルダを作成します。
# Maildirフォルダの作成
mkdir -p /home/testuser/Maildir/{new,cur,tmp}
# 所有権の変更
chown -R testuser:testuser /home/testuser/Maildir
# 権限の変更(本人以外は見られないようにする)
chmod -R 700 /home/testuser/Maildirファイルが正しく作成されたかを確認します。drwx------ と表示されていれば、OKです。
ls -ld /home/testuser/Maildir4.Postfixの動作確認
ユーザーの準備ができたら、実際にメールを送ってみます。ここではThunderbirdなどのソフトは使わず、 Telnet を用いてサーバーから直接送信するため、まずTelnetをインストールします。
apt install telnetlocalhostの25番ポートに接続し、手動でメールを送信します。220番が返ってきていればOKです。
telnet localhost 25
--> 220 mail.example.com ESMTP unknown続けて、SMTPコマンドを使用して自作のメールサーバーから自分宛にメールを送信します。
# 挨拶コマンド
helo localhost
--> 250 mail.example.com
# 送信元を指定
mail from:testuser@exmaple.com
--> 250 2.1.0 Ok
# 宛先を指定
rcpt to:testuser@exmaple.com
--> 250 2.1.5 Ok
# 本文入力の開始の合図
data
--> 354 End data with <CR><LF>.<CR><LF>
# 本文
This is a first mail.
.
--> 250 2.0.0 Ok: queued as XXXXXXXX
# 切断
quit
--> 221 2.0.0 Bye
--> Connection closed by foreign host.最後に、先ほど作成した Maildir/new ディレクトリを確認します。ファイルが生成されていればSMTPによるメールの送信は成功です。
ls -R /home/testuser/Maildir/new/3.3. POP3サーバーの構築(Dovecot)
Postfixの設定で、サーバー内部の Maildir にメールが届くようになりましたが、このままではメールサーバーにログインしてファイルを直接見る必要があります。そこで、 外部からメールソフト(Thunderbirdなど)を使って閲覧するために、オープンソースのDovecotを利用してPOP3サーバーを構築します。
1.Dovecotのインストール
apt install dovecot-core dovecot-pop3d
2.設定ファイルの編集
メインの設定ファイルである /etc/dovecot/conf.d/10-main.conf を編集します。
vi /etc/dovecot/conf.d/10-mail.conf
変更内容
メールの保存形式を変更します。
mail_location = mbox:~/mail:INBOX=/var/mail/%u
↓
mail_location = maildir:~/Maildir
次に、 /etc/dovecot/conf.d/10-auth.conf を編集します。
vi /etc/dovecot/conf.d/10-auth.conf
変更内容
今回はSSL/TLS証明書を使わない最小構成で検証するため、平文でのパスワード認証を許可します。
※本番環境ではセキュリティリスクとなるため、推奨されない設定です。あくまで学習用として設定します。
# 平文認証を許可する
#disable_plaintext_auth = yes
↓
disable_plaintext_auth = no
3.変更内容の反映
設定が完了したら、Dovecotを再起動して変更を適用します。
sudo systemctl restart dovecot
sudo systemctl enable dovecot
3.4. DNS設定(オプション)
もし、サーバー内部の挙動やプロトコルを学ぶことだけが目的であれば、このDNS設定はスキップしても構いません。 しかし、Gmailなど外部からこのサーバー宛てにメールを送ってみたい場合は、独自ドメインの取得とDNSの設定が必要となります。
今回はCloud DNSを使用して、取得済みのドメイン(例: example.com)をメールサーバーに紐付けました。以下の手順では example.com を、ご自身が取得した独自ドメイン名に置き換えて読み進めてください。
1. Aレコードの登録
まずは、サーバーに名前をつけます。 メールサーバーとして稼働させるホスト名(例: mail.example.com)に対し、VMインスタンスの外部IPアドレス(例: 34.xxx.xxx.xxx)を紐付けます。
- DNS名:
mail.example.com - タイプ: A
- IPv4アドレス:
34.xxx.xxx.xxx

2. MXレコードの登録
次に、ドメイン宛てのメールをどのサーバーに配送するかを定義します。
- DNS名:
example.com - タイプ: MX
- データ:
10 mail.example.com.

この2つの設定を組み合わせることでメールが届きます。 具体的には、MXレコードによって「@example.com 宛のメールは mail.example.com へ配送せよ」と指示され、その後Aレコードによって「mail.example.com のIPアドレスは 34.xxx.xxx.xxx である」と名前解決が行われます。

3. 設定の反映確認
DNSの設定が伝播するまで、数分かかることがあります。 手元のPCのターミナルから正しく名前解決できているか確認します。
# Aレコードの確認
dig mail.example.com +short # Mac/Linux
nslookup mail.example.com # Windows
--> 34.xxx.xxx.xxx # サーバーのIPアドレスが返ってくればOK
# MXレコードの確認
dig example.com MX +short # Mac/Linux
nslookup -type=MX example.com # Windows
--> 10 mail.example.com. # 指定したホスト名が返ってくればOK
3.5. メールソフトでの確認(Thunderbird)
Telnetを用いてサーバー内部でメールの確認を行いましたが、これはあくまでサーバー単体のテストです。Dovecotを導入した目的は、メールソフトからの問い合わせに応答し、メールボックスの中身を正しく引き渡すことにあります。
ここではオープンソースのメールソフトであるThunderbirdを使用し、メールソフトがDovecotを用いてPOP3でメールを取得できるか確認します。
1. Thunderbirdのインストール
以下の公式サイトからThunderbirdをインストールします。

2. Thunderbirdのアカウント設定
Thunderbirdを起動したら、アカウントのセットアップを行います。 手動設定を選択し、以下の情報を入力します。
- あなたのお名前: 任意
- メールアドレス: 作成したユーザー名+ドメイン名(例:
testuser@example.com) - パスワード: 設定済みのパスワード
受信サーバー
- プロトコル: POP3
- ホスト名:
- DNS設定あり:
mail.example.com - DNS設定なし:
34.xxx.xxx.xxx
- DNS設定あり:
- ポート番号: 110
- 接続の保護: なし
- 認証方式: 通常のパスワード認証
- ユーザー名:
testuser
送信サーバー(今回は受信の確認なので適当でOKです)
- ホスト名:
- DNS設定あり:
mail.example.com - DNS設定なし:
34.xxx.xxx.xxx
- DNS設定あり:
- ポート番号: 25
- 接続の保護: 自動検出
- 認証方式: 自動検出
- ユーザー名:
testuser

完了時、警告画面が表示されますが、本番環境ではないため確認を押して設定を完了させます。

3.メールの受信確認(内部メール)
先ほどTelnetを用いて送信したテストメールが受信トレイに表示されれば、メールの引き渡しが正しく行われていることが確認できます。
4.メールの受信確認(外部メール)
DNS設定を行っている場合は、外部からのメール受信もテストします。 普段利用しているメールアドレス(GmailやYahooなど)から、今回作成した testuser@example.com 宛てにメールを送信します。
リロードしてThunderbirdの受信トレイにそのメールが表示されれば、インターネット上のメールサーバーとして正しく稼働しています。
3.6.メールの送信
本環境から外部のアドレスへメールを送信することはできません。これはGoogle Cloudを含む主要なクラウド事業者が、スパムメール対策として外部への25番ポート通信をブロックしているためです(通称OP25B: Outbound Port 25 Blocking)。
この制限を回避して送信を行うには、SendGridなどのリレーサービスを経由する設定や、認証周りの追加構築が必要となります。これらの手順については今回の記事では割愛します。
4. まとめ
本記事では、PostfixとDovecotを用いて実際にGoogle Cloud上にメールサーバーの構築を行いました。メールの送受信の裏側で行われている通信の仕組みを、自らの手で構築・検証することで、ブラックボックスの中身を体系的に学ぶことができたと感じています。便利なクラウドサービス全盛の今だからこそ、ブラックボックスの中身を自ら紐解く経験は、技術の勘所を養う上で何よりの近道であると改めて実感しました。
Furious Greenでは、こうした「自ら手を動かして本質を理解する」姿勢を大切に、実践的な技術トレーニングを提供しています。 エンジニアの育成や、実務に即したスキル習得にお悩みの方は、ぜひお気軽にご相談ください。
参考サイト

