【Postfix/Dovecot】メールサーバ構築（EC2利用）

##目標
AWS EC2上にPostfixとDovecotをインストールし、メールサーバ（SMTPサーバ・POP/IMAPサーバ）を構築する。

##前提
・メールサーバとして利用するEC2が構築済みであること。
・ドメインを取得し、DNSに登録されていること（※１）。
・**注意点として、AWSEC2はデフォルトだと、EC2⇒インターネットの25番ポート宛て通信が制限されており不可となっております、つまりEC2からの外部宛てメール送信は不可ということです（スパムメールの踏み台に利用されることを回避するためで、許可するには別途AWSへ申請を行う必要があるよう）（※２）。**

※１　以下記事で、ドメイン取得、及びDNS登録（AWS Route53利用）を実施致しました。
[AWS Route53を利用してEC2へ独自ドメインアクセス](https://qiita.com/aWdfcfG2jLr73pe/items/4a141a880351cf655de9)

※２　参考AWSドキュメント
[EC2 インスタンスからポート 25 の制限を削除するにはどうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-port-25-throttle/)


##利用環境
仮想マシン：　AWS EC2
OS：　Red Hat Enterprise Linux 8 
ミドルウェア：　Postfix、Dovecot

##作業の流れ
| 項番 | タイトル |
|:----:|:-------------|
| 1 | [SMTPサーバの構築](#1smtpサーバの構築) |
| 2 | [POP/IMAPサーバの構築](#2popimapサーバの構築)|
| 3 | [DNSレコード登録](#3dnsレコード登録)|
| 4 | [SMTPサーバの動作チェック](#4smtpサーバの動作チェック)|
| 5 | [POP/IMAPサーバの動作チェック](#5popimapサーバの動作チェック)|

##手順
###1.SMTPサーバの構築
**①メールサーバとして利用予定のEC2のセキュリティグループ確認**
以下のように、SSHに加え、SMTP、POP3、IMAPのポートが開いていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/11d10a38-4b32-c993-d408-0b63490ed5fa.png)

**②対象のEC2にOSログインし、postfixをインストール**

ルートスイッチ

```bash

sudo su -
```

postfixインストール実行

```bash

yum install postfix
```

**③postfixのメイン設定ファイル（main.cf）編集**
設定例です。`myhostname`、`mydomain`、`mynetworks`に関してはホスト名やドメイン名に従って書き換えをする必要があります。

```bash

vi /etc/postfix/main.cf
```

```bash
# 自ホスト名
myhostname = mailserver.ryosukeonline.com

# 自ドメイン設定
mydomain = ryosukeonline.com

# 自ホスト上でローカルメール送信を行う場合、メールアドレスの@以降には自ドメイン名を補完する
myorigin = $mydomain

# ローカルホスト以外からも通信を受け付ける
inet_interfaces = all

# メールを取得するドメイン名（メールの宛先ドメインがここで指定した値にマッチした場合、自ホスト宛てとして認識する）
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# メール中継を許可するSMTPクライアントのアドレス（VPCのネットワークアドレスとローカル通信あたりを指定すればOK）
mynetworks = 172.31.0.0/16, 127.0.0.0/8

# Mairdir形式でメールを保存
home_mailbox = Maildir/
```

**③メール受信用ディレクトリ作成**
本記事ではメールボックスの形式として**Maildir形式**（現在の主流、各ユーザのホームディレクトリ以下に1メール1ファイルとして保存する形式）を利用しているため、ユーザ作成時、ホームディレクトリにメール受信用ディレクトリが自動的に作成されるよう設定します。

```bash

mkdir -p /etc/skel/Maildir/{new,cur,tmp}
```

```bash

chmod -R 700 /etc/skel/Maildir/
```

**④メール受信用テストユーザ作成**

```bash

useradd test
```

```bash

passwd test
```



```bash

# /home/test/Maildir/配下に以下のディレクトリが作成されていればOK
ls -l /home/test/Maildir/
total 0
drwx------. 2 test test 6 Jul 23 10:13 cur
drwx------. 2 test test 6 Jul 23 10:13 new
drwx------. 2 test test 6 Jul 23 10:13 tmp
```

**⑤postfix起動**

```bash

systemctl start postfix
```

```bash

# 状態がrunnningであること
systemctl status postfix
```

25番ポートが開いていることを確認します。

```bash

# 25番ポートがLISTENであること
netstat -atn
```

自動起動も有効化しておきます。

```bash

systemctl enable postfix
systemctl is-enabled postfix
```

###2.POP/IMAPサーバの構築
**①Dovecotのインストール**

```bash

yum install dovecot
```

**②Dovecotの設定ファイルの編集**


メイン設定ファイル**dovecot.conf**編集

```bash

vi /etc/dovecot/dovecot.conf
```

```bash

# IMAPとPOP3を通信プロトコルとして利用する
protocols = imap pop3
```

外部からのプレインテキスト通信を許可（IMAPとPOP3はSSL暗号化がされていないため、デフォルトの設定ですと通信が拒否されてしまうようです。その回避策として実施する必要があります。）

```bash

vi /etc/dovecot/conf.d/10-auth.conf
```

```bash

disable_plaintext_auth = no
```

```bash

vi /etc/dovecot/conf.d/10-ssl.conf
```

```bash

ssl = no
```

**③Dovecot起動**

```bash

systemctl start dovecot
systemctl status dovecot
```

```bash

# 110及び143番ポートが開いていること
netstat -atn
```

自動起動の有効化

```bash

systemctl enable dovecot
systemctl is-enabled dovecot
```


###3.DNSレコード登録
**メールサーバのDNSレコード登録**
DNSに登録済みのドメインに、メールサーバのMXレコード及びAレコードを追加（※）します。

※登録方針
<ドメイン名> in MX 10 <メールサーバ名>
<メールサーバ名> in A <メールサーバのグローバルIPアドレス>


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/f127fd69-d70c-e71e-1e37-aededf4fba6a.png)

念のためコマンドプロンプトからnslookupで名前解決確認

```bash
# MXレコードの確認
nslookup -type=mx ryosukeonline.com
（中略）
ryosukeonline.com       MX preference = 10, mail exchanger = mailserver.ryosukeonline.com

# Aレコードの確認
nslookup mailserver.ryosukeonline.com
（中略）
名前:    mailserver.ryosukeonline.com
Address:  18.183.102.144
```

###4.SMTPサーバの動作チェック
**①構築したメールサーバに向けてメールを送信**
Outlook等を利用します。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/bf403235-7d19-e36a-5be9-b16a3f895d89.png)

**②メールが届いているかメールサーバ内確認**

```bash
# /home/test/Maildir/new/配下にメールが追加されていればOK
ls -l /home/test/Maildir/new/
total 8
-rw-------. 1 test test 7367 Jul 24 11:13 1595589209.Vca02I1000b85M204385.ip-172-31-44-212.ap-northeast-1.compute.internal
```

###5.POP/IMAPサーバの動作チェック
他のEC2からPOP及びIMAP通信（telnet利用）を試みます（※）。

※POPやIMAPのコマンドは以下を参考に致しました。
・POP
[メールサーバー構築手順（Postfix / Dovecot）初心者でもできるメモ（受信メール確認）](https://genchan.net/it/server/1566/#i-5)
・IMAP
[IMAPをコマンド操作する](https://www.magata.net/memo/index.php?IMAP%A4%F2%A5%B3%A5%DE%A5%F3%A5%C9%C1%E0%BA%EE%A4%B9%A4%EB)

**①メールサーバとは別のEC2にOSログインし、telnetをインストール**

```bash

sudo yum install telnet
```

**②POPサーバのチェック**
POP通信でメールサーバに保存されているメールが確認できればOKです。


```bash

telnet mailserver.ryosukeonline.com 110 # telnetで110番ポート（POPサーバ）接続
Trying 52.192.196.3...
Connected to mailserver.ryosukeonline.com.
Escape character is '^]'.
+OK Dovecot ready.

User test # ユーザ名の入力
+OK

Pass password # testユーザのパスワードを入力
+OK Logged in.

LIST # メール一覧の取得
+OK 2 messages:
1 7516
2 7517
.

RETR 1 # メール番号1の内容を確認
+OK 7516 octets
# 以下メール内容はほぼ省略した内容
To: "test@ryosukeonline.com" <test@ryosukeonline.com>
Subject: TEST SUBJECT
Thread-Topic: TEST SUBJECT
Date: Sun, 26 Jul 2020 10:00:36 +0000

This is a test mail!
.

QUIT # 通信終了
+OK Logging out.
Connection closed by foreign host.
```

**③IMAPサーバのチェック**
IMAP通信でメールサーバに保存されているメールが確認できればOKです。

```bash
# telnetで143番ポート（IMAP）へ通信
telnet mailserver.ryosukeonline.com 143
Trying 52.192.196.3...
Connected to mailserver.ryosukeonline.com.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ AUTH=PLAIN] Dovecot ready.

# <識別子> login <ユーザ名> <パスワード>　//ログインする
1 login test password 
1 OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY LITERAL+ NOTIFY SPECIAL-USE] Logged in

# <識別子> list "" * //メールボックス一覧確認
2 list "" *
* LIST (\HasNoChildren) "." INBOX
2 OK List completed (0.001 + 0.000 secs).

# <識別子> select INBOX　//メールボックス内容確認
3 select INBOX
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 2 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1595758218] UIDs valid
* OK [UIDNEXT 3] Predicted next UID
3 OK [READ-WRITE] Select completed (0.001 + 0.000 secs).

# <識別子> fetch 1 body[]　//メール内容確認
4 fetch 1 body[]
* 1 FETCH (BODY[] {7516}
To: "test@ryosukeonline.com" <test@ryosukeonline.com>
Subject: TEST SUBJECT
Thread-Topic: TEST SUBJECT
Date: Sun, 26 Jul 2020 10:00:36 +0000

This is a test mail!

4 OK Fetch completed (0.001 + 0.000 secs).

# <識別子> logout　//通信終了
5 logout
* BYE Logging out
5 OK Logout completed (0.001 + 0.000 secs).
Connection closed by foreign host.
```

##(追記)Windows10メールクライアントを利用したメール受信
Windows10メールクライアントからメールサーバ上のメールを取り出してみます。
以下の設定でインターネットメールアカウントを追加（※）します。
なお、前提に記載の通りEC2からの外部宛てメール送信は原則不可のため、受信専用のアカウントとなります。

※参考
[メールソフトの設定【Windows10 メールアプリ】](https://fctv.mitene.jp/mailsetting/windows10_pop.html)

設定値
ユーザ名：　**メールアカウント名（本記事ではtestユーザが該当）**
パスワード：　**メールアカウントのパスワード（本記事ではtestユーザのパスワードを入力）**
受信メールサーバ：　**構築したメールサーバのFQDN**
アカウントの種類：　**IMAP4**
下段の4つのチェックボックス：　**全てチェック外す**


![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/a5d94408-5266-da00-b4e7-f35cb1cf2572.png)
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/06eabc0a-d567-9ac1-2865-ec4330384633.png)
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/67cb0b81-e91e-161f-4286-5b93c8a8095e.png)

同期を行い、正常に構築したメールサーバ上のメールが受信ボックスに表示されればOKです。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/ffd9ee13-398a-6aec-0ee1-15403446de7e.png)