##目標
AWS EC2上にPostfixとDovecotをインストールし、メールサーバ(SMTPサーバ・POP/IMAPサーバ)を構築する。
##前提
・メールサーバとして利用するEC2が構築済みであること。
・ドメインを取得し、DNSに登録されていること(※1)。
・注意点として、AWSEC2はデフォルトだと、EC2⇒インターネットの25番ポート宛て通信が制限されており不可となっております、つまりEC2からの外部宛てメール送信は不可ということです(スパムメールの踏み台に利用されることを回避するためで、許可するには別途AWSへ申請を行う必要があるよう)(※2)。
※1 以下記事で、ドメイン取得、及びDNS登録(AWS Route53利用)を実施致しました。
AWS Route53を利用してEC2へ独自ドメインアクセス
※2 参考AWSドキュメント
EC2 インスタンスからポート 25 の制限を削除するにはどうすればよいですか?
##利用環境
仮想マシン: AWS EC2
OS: Red Hat Enterprise Linux 8
ミドルウェア: Postfix、Dovecot
##作業の流れ
項番 | タイトル |
---|---|
1 | SMTPサーバの構築 |
2 | POP/IMAPサーバの構築 |
3 | DNSレコード登録 |
4 | SMTPサーバの動作チェック |
5 | POP/IMAPサーバの動作チェック |
##手順
###1.SMTPサーバの構築
①メールサーバとして利用予定のEC2のセキュリティグループ確認
以下のように、SSHに加え、SMTP、POP3、IMAPのポートが開いていることを確認
②対象のEC2にOSログインし、postfixをインストール
ルートスイッチ
sudo su -
postfixインストール実行
yum install postfix
③postfixのメイン設定ファイル(main.cf)編集
設定例です。myhostname
、mydomain
、mynetworks
に関してはホスト名やドメイン名に従って書き換えをする必要があります。
vi /etc/postfix/main.cf
# 自ホスト名
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ファイルとして保存する形式)を利用しているため、ユーザ作成時、ホームディレクトリにメール受信用ディレクトリが自動的に作成されるよう設定します。
mkdir -p /etc/skel/Maildir/{new,cur,tmp}
chmod -R 700 /etc/skel/Maildir/
④メール受信用テストユーザ作成
useradd test
passwd test
# /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起動
systemctl start postfix
# 状態がrunnningであること
systemctl status postfix
25番ポートが開いていることを確認します。
# 25番ポートがLISTENであること
netstat -atn
自動起動も有効化しておきます。
systemctl enable postfix
systemctl is-enabled postfix
###2.POP/IMAPサーバの構築
①Dovecotのインストール
yum install dovecot
②Dovecotの設定ファイルの編集
メイン設定ファイルdovecot.conf編集
vi /etc/dovecot/dovecot.conf
# IMAPとPOP3を通信プロトコルとして利用する
protocols = imap pop3
外部からのプレインテキスト通信を許可(IMAPとPOP3はSSL暗号化がされていないため、デフォルトの設定ですと通信が拒否されてしまうようです。その回避策として実施する必要があります。)
vi /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
vi /etc/dovecot/conf.d/10-ssl.conf
ssl = no
③Dovecot起動
systemctl start dovecot
systemctl status dovecot
# 110及び143番ポートが開いていること
netstat -atn
自動起動の有効化
systemctl enable dovecot
systemctl is-enabled dovecot
###3.DNSレコード登録
メールサーバのDNSレコード登録
DNSに登録済みのドメインに、メールサーバのMXレコード及びAレコードを追加(※)します。
※登録方針
<ドメイン名> in MX 10 <メールサーバ名>
<メールサーバ名> in A <メールサーバのグローバルIPアドレス>
念のためコマンドプロンプトからnslookupで名前解決確認
# 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等を利用します。
②メールが届いているかメールサーバ内確認
# /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)初心者でもできるメモ(受信メール確認)
・IMAP
IMAPをコマンド操作する
①メールサーバとは別のEC2にOSログインし、telnetをインストール
sudo yum install telnet
②POPサーバのチェック
POP通信でメールサーバに保存されているメールが確認できればOKです。
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です。
# 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 メールアプリ】
設定値
ユーザ名: メールアカウント名(本記事ではtestユーザが該当)
パスワード: メールアカウントのパスワード(本記事ではtestユーザのパスワードを入力)
受信メールサーバ: 構築したメールサーバのFQDN
アカウントの種類: IMAP4
下段の4つのチェックボックス: 全てチェック外す