Amazon-Simple-Email-Service-SES

【AWS】EC2からSESを使ってメールを送信しよう

はじめに

こんにちはディーネットのタナミです。
4月になり入社してから1年経ちました。去年のこの時期も曇り空が多かったのを覚えています。
晴れていると気分がほんの少し上がるので、はやく晴れて欲しいですね。

さてメールサーバーをEC2で構築する際、DKIM鍵の管理や、スパム判定への対策が課題となるかと思います。
本ブログでは、これらをAmazon SESに任せつつ、EC2で受信を行うAWSならではのメールサーバーを構築していきます。

事前準備

EC2でSESを介してメールを送信する際に、いくつかの事前準備があるので設定を行います。
また、本ブログでは下記のような条件で構築を進めます。

OS:AlmaLinux 9.7
ドメイン名:example.com
SESサンドボックス申請、25番ポート制限解除申請のどちらも済んでいること

EC2セキュリティグループ作成

最初にメールの送受信を許可するために、セキュリティグループを作成する必要があります
VPCのセキュリティーグループから「セキュリティグループを作成」を押下します。

下図のようなインバウンドルールでセキュリティグループを作成します。

それぞれのポートの役割は以下の通りです。
また、本ブログではSTARTTLSを使用する想定のため110143を許可しております。
110・143・587番ポートは自拠点のIPのみ許可する方がよりセキュアです。

ポート番号 プロトコル 役割
25 SMTP 外部メールサーバーからEC2へのメール受信
110 POP3 メールクライアントからEC2へメールを取得
143 IMAP メールクライアントからEC2へメールを取得
587 Submission メールクライアントからEC2経由でSESへ送信

レコードを登録

次にレコード登録のため、ゾーンファイルを作成します
xxx.xxx.xxx.xxxはEC2のIPに置き換えてください。

example.com 300s A xxx.xxx.xxx.xxx
example.com 300s MX 10 example.com
example.com 300s TXT "v=spf1 include:amazonses.com ~all"

対象のホストゾーンから「ゾーンファイルをインポート」を押下し、先ほどのゾーンファイルを貼り付けます。

SESの作成

セキュリティグループとレコードの登録が完了したら、送信の要であるSESの作成を行います。
SESのIDメニューから「IDの作成」を押下します。

使用するドメイン名でIDを作成します。
また、既にDKIM鍵がある場合は「DKIM 認証トークンの指定 (BYODKIM)」を選択しDKIM鍵をインポートします。

IDの作成が完了したら、「DNSレコードのRoute53への発行」を押下し、Route53へレコードを登録します。

SMTPユーザの作成

次にEC2でSESを使用するためにユーザを作成する必要があります。
SMTP設定の「SMTP認証情報の作成」を押下し、SMTPユーザを作成します。

ユーザ名を入力し、ユーザを作成したら「csvファイルのダウンロード」を必ず行います。
SMTPユーザ名とSMTPパスワードは後ほど使用するので、控えておいてください。

サーバー内事前準備

事前準備とSESの作成が完了したら、いよいよEC2の構築に移ります。
まずはPostfix・Dovecot・cyrus-saslのインストール確認を下記コマンドで行います。

rpm -q postfix dovecot cyrus-sasl

インストールされている場合は下記のように表示されます。

postfix-3.5.25-1.el9.x86_64
dovecot-2.3.16-15.el9.x86_64
cyrus-sasl-2.1.27-22.el9.x86_64

インストールされていない場合は下記のように表示されるので、次項にてインストールを行います。

パッケージ postfix はインストールされていません。
パッケージ dovecot はインストールされていません。
パッケージ cyrus-sasl はインストールされていません。

ミドルウェアがインストールされていない場合

前項でミドルウェアがインストールされていなかった場合は、下記コマンドでインストールを行います。

dnf install postfix dovecot cyrus-sasl
--結果のみ--
インストール済み:
  clucene-core-2.3.3.4-42.20130812.e8e3d20git.el9.x86_64  cyrus-sasl-2.1.27-22.el9.x86_64  dovecot-1:2.3.16-15.el9.x86_64  libexttextcat-3.4.5-11.el9.x86_64  postfix-2:3.5.25-1.el9.x86_64

完了しました!

インストール後、念のためインストール確認を再度行います。

rpm -q postfix dovecot cyrus-sasl

このような結果が表示されていれば、インストール完了です。

postfix-3.5.25-1.el9.x86_64
dovecot-2.3.16-15.el9.x86_64
cyrus-sasl-2.1.27-22.el9.x86_64

自己証明書の設置

EC2とメールクライアント間の通信をセキュアにするため、自己証明書を使用します。
本ブログでは自己証明書を使用していますが、正式な証明書がある場合はそちらを使用して下さい。

下記コマンドで自己証明書を発行します。
example.comとなっている部分は、それぞれ設定したいドメインに読み替えて設定して下さい。

openssl req -newkey rsa:2048 -nodes \
  -keyout /etc/pki/tls/private/mailserver.key \
  -x509 -days 3650 \
  -out /etc/pki/tls/certs/mailserver.pem \
  -subj "/C=JP/ST=Tokyo/L=Tokyo/O=MyOrg/CN=example.com"

発行後、自己証明書が正常に作成されているか確認します。

ll /etc/pki/tls/private/mailserver.key
-rw------- 1 root root 1704  4月  3 10:23 /etc/pki/tls/private/mailserver.key
ll /etc/pki/tls/certs/mailserver.pem
-rw-r--r-- 1 root root 1322  4月  3 10:23 /etc/pki/tls/certs/mailserver.pem

SMTP認証情報ファイル作成

次に、Postfixの設定を行います。
まずは、SMTPユーザ用の認証情報ファイルを作成します。

vi /etc/postfix/sasl_passwd
--以下の内容を記載--
[email-smtp.ap-northeast-1.amazonaws.com]:587 SMTPユーザ名:SMTPパスワード

Postfixが読み込めるDB形式に変換します。

postmap /etc/postfix/sasl_passwd
--以下で権限を設定--
chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

Postfix設定

さて、ミドルウェアのインストール等が完了したら、ミドルウェアの設定に移ります。
まずはPostfixの設定から進めます。

設定ファイルのバックアップを作成します。

cp -p  /etc/postfix/main.cf /etc/postfix/main.cf.$(date +%Y%m%d)

以下のようにファイルが作成されていることを確認します。

ll /etc/postfix/main.cf.$(date +%Y%m%d)
--結果のみ--
-rw-r--r-- 1 root root 29369 10月  3  2024 /etc/postfix/main.cf.20260403

Postfixの設定ファイルに追記・変更します。
example.comとなっている部分は、それぞれ設定したいドメインに読み替えて設定して下さい。

vi /etc/postfix/main.cf
--以下の内容を記載--
# Postfix基本設定
myhostname = example.com
mydomain = example.com
myorigin = example.com
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 127.0.0.0/8
home_mailbox = Maildir/

# SESリレー設定
relayhost = [email-smtp.ap-northeast-1.amazonaws.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
smtp_tls_CApath = /etc/pki/tls/certs

# Dovecot連携設定
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

# 証明書設定
smtpd_tls_cert_file = /etc/pki/tls/certs/mailserver.pem
smtpd_tls_key_file = /etc/pki/tls/private/mailserver.key
smtpd_tls_security_level = may

また、メールクライアントからEC2(SES)と通信するためにsubmissionの設定も行います。

vi /etc/postfix/master.cf
--以下の内容を記載--
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject

Dovecot設定

さて、Postfixの設定が完了したらDovecotの設定に移ります。
以下で設定ファイルのバックアップを行います。

cp -p /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.$(date +%Y%m%d)
cp -rp /etc/dovecot/conf.d/ /etc/dovecot/conf.d.$(date +%Y%m%d)/

それぞれの設定ファイルに以下の通り、追記・変更を行います。

▼/etc/dovecot/dovecot.confの記載内容
protocols = imap pop3
listen = *

▼/etc/dovecot/conf.d/10-ssl.confの記載内容
ssl = required
ssl_cert = </etc/pki/tls/certs/mailserver.pem
ssl_key = </etc/pki/tls/private/mailserver.key
ssl_cipher_list = PROFILE=SYSTEM

▼/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 {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

▼/etc/dovecot/conf.d/10-mail.confの記載内容
mail_location = maildir:~/Maildir

▼/etc/dovecot/conf.d/10-auth.confの記載内容
disable_plaintext_auth = yes
auth_mechanisms = plain login

サービス起動

さてミドルウェアの設定が完了したら、以下のコマンドでミドルウェアの構文チェックを行います。

Postfix構文チェック
エラーが無ければ何も出力されません。

 postfix check

Dovecot構文チェック
デフォルト値から変更されている設定のみ表示されます。エラーがある場合はその旨が出力されます。

doveconf -n

上記のコマンドで問題が無ければ、ミドルウェアの起動を行います。

systemctl restart postfix dovecot saslauthd
--自動起動も併せて設定--
systemctl enable postfix dovecot saslauthd

起動後、それぞれのミドルウェアの起動状態の確認を行います。

systemctl status postfix dovecot saslauthd
--結果のみ--
● postfix.service - Postfix Mail Transport Agent
     Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; preset: disabled)
     Active: active (running) since Mon 2026-04-06 16:25:52 JST; 3min 48s ago

● dovecot.service - Dovecot IMAP/POP3 email server
     Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; preset: disabled)
     Active: active (running) since Mon 2026-04-06 16:27:52 JST; 1min 48s ago

● saslauthd.service - SASL authentication daemon.
     Loaded: loaded (/usr/lib/systemd/system/saslauthd.service; enabled; preset: disabled)
     Active: active (running) since Mon 2026-04-06 16:28:38 JST; 1min 2s ago

ユーザを作成

さて、ミドルウェアの起動が完了したら、ユーザの作成を行います。
今回はtestというユーザ名で作成を行います。

useradd -m test

以下でパスワードを設定します。
※設定したパスワードはメールクライアントでのログイン時に使用するので、控えておいてください。

passwd test

最後に、メールディレクトリを作成します。
これでEC2+SESのメールサーバーは構築完了です。

mkdir -p /home/test/Maildir/{new,cur,tmp}
--以下で権限を設定--
chown -R test:test /home/test/Maildir
chmod -R 700 /home/test/Maildir

まとめ

今回はEC2とSESを組み合わせて、送受信対応のメールサーバーを構築しました。
設定完了後は、sendmailでの送信確認やメールクライアントへの接続確認を忘れずに行いましょう。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA