初心者がメールサーバの誤解を解いた話

# はじめに
この記事はインフラ初心者がEC2上で「メールサーバ」を構築した際に、筆者が今まで抱えていた誤解と理解した（つもりの）メールサーバ（SMTP・POP3)の仕組みについて解説する記事です。

順序立てて解説するのではなく、私がPosftfix等を構築する流れにそって説明します。

# 誤解の発生
インフラ初心者の私は、勉強のためEC2で「メールサーバ」に建てることにしました。

私「送信のためにPostfix(SMTPサーバ）、受信のためにDovecot（POP3サーバ）を使用しよう」
（※DovecotにはIMAPもありますが、今回はPOP3を使用し、POP3を前提とした話です）
私「**SMTPは送信専用**プロトコル・**POP3は受信専用**プロトコルって言うもんな！」
（※メールの設定やよくある解説では「送信」「受信」の括りで説明されてるため）

**この考えは完全に「誤解」でした。**

結論を先に述べると、**「SMTPは送信専用じゃない」「POP3はメールを直接受け取っている訳ではない」**

# とりあえずPostfixを建てた

色々と情報を調べた後、安いドメインを取得してRoute53でレコードを設定。
初期設定でAWSのEC2の25ポート（SMTP)は閉じられているので、Amazonにメールを送り開放してもらいます。


とりあえず、Posftfixを建てることにしました。
EC2には既にPosffixはインストールされているので、ドメインなどの設定とユーザー作成を行えば良いとのこと。

### main.cfを設定、アドレス用のユーザー作成

まず、/etc/postfix/main.cfの異様なコメントまみれで「どこに設定項目があるんだよ……」「これ全部コメントで設定項目解説してるのか？別ファイルにしてくれよ……」と初心者を絶望させる設定ファイルを、頼りになる先人達の情報を参考にしながら変更していきます。

```main.cf
myhostname = mail.ドメイン名
mydomain = ドメイン名
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
home_mailbox = Maildir/ 
```
サーバのホストネーム・対応するドメイン名・外部とやりとり出来るように・宛先設定・メールの保存形式の設定です。
そして、構文チェックをかけてPosftfixを再起動したらアドレス用のユーザーを作成します。

```
postconf -n
systemctl restart postfix
useradd mailuser
passwd mailuser
```

# 「メールの受信テストを行う」
参考情報にはその様に書いていました。
情報を読んでいた段階で既にわかってはいたんですが、 **「Posftfixはメールを受信できる」** 訳です。
当初考えていたPostfix（SMTPサーバ）は送信専用という考えが誤っていた事がわかります。

「Postfix楽し～！」と思いながら普段使っているGメールから、先程作った「ユーザー名+ドメイン名」宛にメールを送ります。
そして、Postfix側で確認すると、ちゃんとメールが届いているではありませんか

```
cd /home/info/Maildir/new/
less メール名
```
送信も試してみると当然ちゃんと送ることに成功しました。

```
sendmail -t<<EOL
From:mailuser@ドメイン名
To:私物のGメール
Subject:Test
Test mail!
EOL
```

### あれ……？Postfix（SMTP）で一応完結している……
Postfixは「メールの送信」「メールの受信」を行えます。
そして、「アドレスとその保管場所の作成」も行っている訳です。

つまり、**「メールの送受信を行い、各アドレスのメールを保管しているのがPostfix（SMTP)」**となります。
一応これ単体で**「メールサーバ」としては完結**しています。

# Dovecot（POP3）も入れてみる。
Dovecot（POP3）も入れてみることにしました。
ここからの作業は端折りますが、Dovecotを導入した際に「ユーザー（アドレス）の作成」を行う事はありません。
また稼働させるだけならほぼ設定がそのままで問題なく、メール形式を「Maildir」にした位です。

Dovecotでメールを確認してみます。
外部からtelnetでDovecotにアクセスする際に、アクセスする「ユーザー・パスワード」を求められます。

```
telnet ドメイン名 110
user mailuser
pass 
list 
retr 1
```

そしてアクセスが出来ると、先程確認したメールをこちらで確認する事ができました。
同じサーバ上のディレクトリに存在するメールを接続した人間（クライアント）に引き渡してくれている動作に見えます。

つまり、**Dovecot（POP3）はメールサーバを確認してメールをクライアントに送ってくれる役割**という事になります。

# メールの配送の仕組み
Postfix（SMTP）・Dovecot（POP3)の役割は上記の認識であっているのか……
筆者は参考書やネットで探して調べました。
大体この認識で合っていたようなので、メール配送の仕組み合わせて説明します。
<img width="700px"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901230/674f8965-881d-c106-657d-9d7f8a18865e.jpeg">
メール配送の仕組みは少々ややこしく、SMTP・POPといったプロトコルの役割以外にPostfix・Dovecotが持つメールサーバの機能についても説明します。
メールがどうやって、どんな機能を使って配達されているのか図にしました。

MUA→MTA→MTA→MDA←MRA←MUAの関係になっています。

### 流れ
1.送信者はMUAを使ってSMTPプロトコルでメールサーバのMTAにメールを送信します。
2.送信側のメールサーバのMTAが受信側のメールサーバのIPをDNSで確認し、SMTPプロトコルでメールを送信（転送）します。
3.受け取った受信側MTAはMDAにメールを渡し、MDAは対象ユーザーのメールボックスに配達します。
4.受信者はMUAを使ってメールを見ようとすると、MRAはメールボックス内のメールをMUAに渡します。
5.受信者はMUAでメールを見ることができました。

### 用語解説
- MUA(mail user agent)：メールユーザーソフト
つまり端末から受信・送信を行うときに使うメールソフトの事です。有名なのはThunderbirdでしょうか。

- MTA(Message Transfer Agent)：メール転送エージェント
SMTPを使ってメールを転送する機能で、Postfixに含まれています。

- MDA(Mail Delivery Agent)：メール配達（配信）エージェント
MTAが受け取ったメールを対象ユーザーのメールボックスに格納させる機能で、Postfixに含まれています。

- MRA(Mail Retrieval Agent)：メール検索エージェント。
メールボックスにあるメールをMUAに渡してあげる機能です。
POP3・IMAP4のプロトコルを使うため「POP・IMAPサーバ」と呼ばれる物で、Dovecotがこの機能を有しています。

#結論「SMTPはサーバ間の送受信、POPは確認と取り出し（DL）をやっていた」

- サーバ間のメールの送受信（配送）はSMTPを使うPostfixが行っている。
- 端末からメールサーバのメールを見るためにはPOP3を使ってDovecotが取りにいっている。

という事だったので、改めて **「SMTPは送信専用」「POPは受信専用」というのは「誤り」** です。

### なんでこんな仕組みなのか？
数十年前はSMTPだけのメールサーバを建て、そこにtelnetをしてメールを見ていたようです。
ですが次第に利用するユーザーも増え「わざわざtelnetは面倒」という感じで各々の端末からメールを楽に見れる方法が必要でした。
「サーバーが稼働している間しかメールは受信できない」ため、各々の端末をSMTPサーバ化する選択肢はありませんでした。
それをすると、メールサーバが停止してるときにメールが送られても受信できず利便性が悪すぎるからです。

SMTPプロトコルには受信したメールを転送する機能は備わっていないため、メールを見るための別のプロトコルが生まれました。
それがPOPプロトコルで、SMTPが受け取って保管したメールを取り出してクライアントに渡す機能を作ったようです。

今回ここで詳しい説明はしませんが、メールをクライアント側でDLするPOPプロトコルの方がIMAPより早く生まれています。
サーバ上でメールを保管して（＝クライアントに取り込まない）閲覧するIMAPプロトコルはより複雑な仕組みをしています。

### なぜ「SMTPは送信専用」「POP3は受信専用」などと説明されるのか？

メールの配送の仕組みはこの記事を書いていて思いましたが「説明が難しい上に長い」です。
「SMTPは転送用だよ」「POP3はメールボックスのを取りに行ってるんだよ」といっても、図の流れ・仕組みを知らないと理解できません。

また、普段利用するPCやスマートフォンのメール設定で「SMTP設定」「POP3設定」とは何だろう？と思った非技術系の人には、「SMTPは送信」「POP3は受信」というわかりやすい説明が便利だったのかもしれません。

利用者の端末からメールを見る（受信）ためには「POP3」の設定が必要な訳ですから、面倒な説明よりも「受信用」と説明し、その対として「SMTPは送信用」と説明しても動作的に間違っているようには見えないからこうなったのかなとも思います。

# 最後に
- インフラ初心者が書いた記事ですので、間違っているかもしれませんので、その際はご指摘頂けると幸いです。
- 実際にPOPサーバは直接受信していない事も検証確認している@d-ebiさんの[SMTPサーバとPOPサーバの実験を交えた詳解](https://qiita.com/d-ebi/items/0809dd1aaed763b7eb66#4-%E8%80%83%E5%AF%9F)という、とても良い記事があります。
- 正直私の記事よりも、参考にした記事や文献を読んだほうが速い上にわかりやすいと思います。
- 筆者はそもそもLPICを勉強していた際に「メール配送の図」を見たりしてPostfixの勉強もした筈ですが、理解がなぁなぁだったと痛感し、手を動かす重要性も理解しました。

# 参考URL
- [メールを受け取る仕組みはどうなっていますか？？](https://ascii.jp/elem/000/000/439/439105/)
- [メールサーバの用語集](https://blog.denet.co.jp/mailserverwords/)
- [EC2上にPostfixサーバを構築](http://blog.kumoto.jp/2016/10/12/ec2%E4%B8%8A%E3%81%ABpostfix%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E6%A7%8B%E7%AF%89/)
- [【第1回】【EC2】PostfixでシンプルなSMTPサーバを構築してみる](https://blog.serverworks.co.jp/build-smtp-server)
- [Postfixによる、セキュリティに配慮したメールサーバの構築方法](https://oxynotes.com/?p=4646)
- [Postfix+Dovecotによるメールサーバ構築](https://dev.classmethod.jp/articles/mail_server_with_postfix_and_dovecot/)
- [SMTPサーバとPOPサーバの実験を交えた詳解](https://qiita.com/d-ebi/items/0809dd1aaed763b7eb66#4-%E8%80%83%E5%AF%9F)

# 参考文献
- Linuxの教科書 LPICレベル２ version4.5対応　出版：株式会社翔泳社
- マスタリングTCP/IP 入門編 第5版　出版：オーム社

# 追記・修正
- POP3を前提とした記述に変更
- Markdownの記述を修正して見出しが正しく表示されるように修正(2025/02)