【EC2】メールサーバ構築（Postfix + Dovecot）

# Postfixとは
- オープンソースの送信用メールサーバー用ソフトウェア
- メールを送信(配送)するときに利用（SMTPサーバー）
- 受信機能なし

# Dovecotとは
- オープンソースの受信用メールサーバー用ソフトウェア
- POP/IMAPサーバー

# 手順
## １）Route53の設定
- 前提：今回はホストゾーンがすでに作られている
- メールサーバのAレコードとMXレコードを追加
　　ホストゾーン：test.site.
　　Aレコード
        名前：mail.test.site.
        値：xx.xxx.xxx.xxx （メールサーバのパブリックIP）

    MXレコード
        名前：空欄
        値：＜プライオリティ＞ ＜メールサーバのFQDN＞
            10 mail.test.site.
            ※. 最後のピリオドを忘れないように

- ローカルのMac上でdigで登録したレコードが正しく引けるかを確認

```
$ dig mx test.site.
（略）
;; QUESTION SECTION:
;test.site.			IN	MX

;; ANSWER SECTION:
test.site.		60	IN	MX	10 mail.test.site.

;; ADDITIONAL SECTION:
mail.test.site.	60	IN	A	<メールサーバのパブリックIP>
（略）
```
参考：[Amazon Route53 にMXレコード登録する](https://blog.apar.jp/web/656/)

## ２）セキュリティグループの設定

SMTP（25）：0.0.0.0/0
IMAPS（993）：0.0.0.0/0
POP3(110)：0.0.0.0/0
SMTPS（465）：0.0.0.0/0
POP3S（995）：0.0.0.0/0

## ３）EC2にPostfixをインストールし設定
- Amazon Linux 2の場合、デフォルトでPostfixがインストールされてるっぽい

```
$ yum list installed postfix
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
インストール済みパッケージ
postfix.x86_64                                          2:2.10.1-6.amzn2.0.3                                           installed
```
- postfixをインストールする場合はこちら

```
$ sudo yum -y install postfix
```

- postfixの起動を確認

```
$ systemctl status postfix
    →Active: active (running)
```
- postfixの自動起動の確認（Amazon Linux 2はデフォルトで自動起動）

```
$ systemctl is-enabled postfix
enabled
```
- /etc/postfix/main.cf を設定

```
$ sudo su -
# vi /etc/postfix/main.cf
----------------
以下はコメントアウト
# mydestination = $myhostname, localhost.$mydomain, localhost
# inet_interfaces = localhost

#inet_protocols = all
inet_protocols = ipv4

以下を追加
# add
myhostname = mail.test.site
mydomain = test.site
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
inet_interfaces = all
mynetworks = 10.0.0.0/16, 127.0.0.0/8
relay_domains = $mydestination
home_mailbox = Maildir/
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination
----------------
```
参考：[Postfix+Dovecotによるメールサーバ構築](https://dev.classmethod.jp/cloud/aws/mail_server_with_postfix_and_dovecot/)


- saslauthdの起動

```
# yum list installed | grep sasl
cyrus-sasl-lib.x86_64                 2.1.26-23.amzn2                installed
cyrus-sasl-plain.x86_64               2.1.26-23.amzn2                installed

# yum install cyrus-sasl cyrus-sasl-md5
# yum list installed | grep sasl
cyrus-sasl.x86_64                     2.1.26-23.amzn2                @amzn2-core ＊追加
cyrus-sasl-lib.x86_64                 2.1.26-23.amzn2                installed
cyrus-sasl-md5.x86_64                 2.1.26-23.amzn2                @amzn2-core ＊追加
cyrus-sasl-plain.x86_64               2.1.26-23.amzn2                installed
```
参考：[Amazon Linux2 + Postfix + Dovecot + Let's EncryptでSSLメールサーバを構築](https://qiita.com/Sabuuuuu---nn/items/cb1b51e84b27b2070488)

```
# systemctl status saslauthd
# systemctl start saslauthd
# systemctl status saslauthd
   → Active: active (running)
```

```
# systemctl is-enabled saslauthd
# systemctl enable saslauthd
# systemctl is-enabled saslauthd
enabled
```

- 利用可能な認証方法を確認
    - 参考：[PostfixのSMTP認証で利用するCyrus SASLライブラリについて](https://oxynotes.com/?p=4428)
```
# saslauthd -v
saslauthd 2.1.26
authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap httpform
```


- 現在のMTAの確認
    -参考：[MTAをpostfixに変更する](http://blog.code4u.org/archives/778)

```
# alternatives --display mta
mta - status is auto.
link currently points to /usr/sbin/sendmail.postfix ＊postfxが利用されてる。postfxであればOK 。Sendmailになってれば変更
/usr/sbin/sendmail.postfix - priority 30
slave mta-mailq: /usr/bin/mailq.postfix
slave mta-newaliases: /usr/bin/newaliases.postfix
slave mta-pam: /etc/pam.d/smtp.postfix
slave mta-rmail: /usr/bin/rmail.postfix
slave mta-sendmail: /usr/lib/sendmail.postfix
slave mta-mailqman: /usr/share/man/man1/mailq.postfix.1.gz
slave mta-newaliasesman: /usr/share/man/man1/newaliases.postfix.1.gz
slave mta-sendmailman: /usr/share/man/man1/sendmail.postfix.1.gz
slave mta-aliasesman: /usr/share/man/man5/aliases.postfix.5.gz
Current `best' version is /usr/sbin/sendmail.postfix.
```

- postfixの再起動

```
# systemctl restart postfix
# systemctl status postfix
```

- メールアドレスとして利用するためのユーザを作成

```
# useradd hoge
# passwd hoge
# su - hoge
$ mkdir Maildir
$ pwd
/home/hoge
$ ll
total 0
drwxrwxr-x 2 cloudpack cloudpack 6 Aug 16 05:02 Maildir
```

## ４）EC2にDovecotをインストールし設定
- dovecotをインストール

```
# yum -y install dovecot
```

- dovecotの自動起動設定

```
# systemctl enable dovecot
# systemctl is-enabled dovecot
enabled
```

- /etc/dovecot/conf.d/10-mail.confの設定
    - メールの保存場所をホームディレクトリのMaildirに設定。
    - 認証方法にloginを追加。 

```
# vi /etc/dovecot/conf.d/10-mail.conf
（略）以下を追加
mail_location = maildir:~/Maildir
auth_mechanisms = plain login
```

- /etc/dovecot/dovecot.confの設定

```
# vi /etc/dovecot/dovecot.conf
↓のコメントアウトを外す
protocols = imap pop3 lmtp
```

- /etc/dovecot/conf.d/10-master.conf の設定

```
# vi /etc/dovecot/conf.d/10-master.conf

（略）
service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
（略）
service pop3-login {
  inet_listener pop3 {
    port = 110
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
（略）
service auth {
（略）
    mode = 0666
    user = postfix
    group = postfix
  }
```

- dovecotを起動

```
# systemctl start dovecot
# systemctl status dovecot
```

## ５）メール受信の確認
- Gmailなどから「hoge@test.site」にテストメールを送信
- telnetを使ってメール受信を確認

```
# telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Dovecot ready.
user hoge      ＊入力
+OK
pass hoge    　＊入力
+OK Logged in.  ＊ログインOK
list　＊入力　＊メール一覧取得
+OK 1 messages:
1 3049
.
retr 1　＊入力　＊１番目のメールを表示
+OK 3049 octets

（テストメールの内容が表示される）

.
quit　＊入力
+OK Logging out.
Connection closed by foreign host.
```

## ６）メール送信の確認
- telnetを使ってGmailにメール送信（localhost）

```
# telnet localhost 25
helo localhost
mail from: user01@mail.test.site （適当なアドレス。存在しないアドレスでもOK.）
rcpt to: <自分のGmailなど>
data
From: user01@mail.test.site
To: <自分のGmailなど>
Subject: test
X-Mailer: TEST MAILER
test mail
.
quit
```
　→少し待てばGmailなどの迷惑メールに届いてるはず