Amazon SES を使ってメールを送信する際に、アプリケーションが直接SESのSMTPインターフェースに接続できる場合は、Wordpressを例にして以前の記事「WordPressプラグインによるAmazon SES 経由のメール送信」で紹介しました。
アプリケーションがSMTPインターフェース接続の機能を持っていない場合や、サーバの各種通知メール等の為に、Postfix からリレーさせて送信できるようにする設定を紹介します。
まず、SESへの(SMTP)接続はTLSでの暗号化を必要としますので、stunnelを使うことで、SESに対するTLSの処理はstunnelで行えるようにしました。
まずは、postfix, mailx, stunnel をインストールします。
$ sudo yum -y install mailx postfix stunnel
MTAをpostfixに切り替えますが、Amzon Linux には「system-switch-mail」パッケージがないので「alternatives」で切り替えます。
$ alternatives --display mta
mta - status is auto. link currently points to /usr/sbin/sendmail.sendmail
デフォルトで上記のように sendmail になっているので、これをpostfixに切り替えます。
$ sudo alternatives --config mta
There are 2 programs which provide 'mta'.
Selection Command
-----------------------------------------------
*+ 1 /usr/sbin/sendmail.sendmail 2 /usr/sbin/sendmail.postfix
Enter to keep the current selection[+], or type selection number: 2
$ alternatives --display mta
mta - status is manual. link currently points to /usr/sbin/sendmail.postfix
sendmail を停止します。
$ sudo /etc/init.d/sendmail stop
次に、stunnelの設定をしていきます。 stunnelの設定ファイルは下記の通りです。
$ pwd
/etc/stunnel
$ cat stunnel.conf
[smtp-tls-wrapper]
accept = 2525
client = yes
connect = email-smtp.us-west-2.amazonaws.com:465
stunnelの起動スクリプトは、 http://www.gaztronics.net/scripts/stunnel.php から取得してきて /etc/init.d/stunnel として置きました。
#!/bin/bash
#
# Script to run stunnel in daemon mode at boot time.
#
# Check http://www.gaztronics.net/ for the
# most up-to-date version of this script.
#
# This script is realeased under the terms of the GPL.
# You can source a copy at:
# http://www.fsf.org/copyleft/copyleft.html
#
# Please feel free to modify the script to suite your own needs.
# I always welcome email feedback with suggestions for improvements.
# Please do not email for general support. I do not have time to answer
# personal help requests.
# Author: Gary Myers MIET MBCS CITP
# Revision 1.0 - 4th March 2005
#====================================================================
# Run level information:
#
# chkconfig: 2345 99 99
# description: Secure Tunnel
# processname: stunnel
#
# Run "/sbin/chkconfig --add stunnel" to add the Run levels.
# This will setup the symlinks and set the process to run at boot.
#====================================================================
#====================================================================
# Paths and variables and system checks.
# Source function library (It's a Red Hat thing!)
. /etc/rc.d/init.d/functions
# Check that networking is up.
#
[ ${NETWORKING} ="yes" ] || exit 0
# Path to the executable.
#
SEXE=/usr/sbin/stunnel
# Path to the configuration file.
#
CONF=/etc/stunnel/stunnel.conf
# Check the configuration file exists.
#
if [ ! -f $CONF ] ; then echo "The configuration file cannot be found!"
exit 0
fi
# Path to the lock file.
#
LOCK_FILE=/var/lock/subsys/stunnel
#====================================================================
#====================================================================
# Run controls:
prog=$"stunnel"
RETVAL=0
# Start stunnel as daemon.
#
start() { if [ -f $LOCK_FILE ]; then echo "stunnel is already running!" exit 0 else echo -n $"Starting $prog: " $SEXE $CONF fi RETVAL=$? [ $RETVAL -eq 0 ] && success echo [ $RETVAL -eq 0 ] && touch $LOCK_FILE return $RETVAL
}
# Stop stunnel.
#
stop() { if [ ! -f $LOCK_FILE ]; then echo "stunnel is not running!" exit 0 else echo -n $"Shutting down $prog: " killproc stunnel RETVAL=$? [ $RETVAL -eq 0 ] rm -f $LOCK_FILE echo return $RETVAL fi
}
# See how we were called.
case "$1" in start) start ;; stop) stop ;; restart) stop start ;; condrestart) if [ -f $LOCK_FILE ]; then stop start RETVAL=$? fi ;; status) status stunnel RETVAL=$? ;; *) echo $"Usage: $0 {start|stop|restart|condrestart|status}" RETVAL=1
esac
exit $RETVAL
自動起動の設定も忘れずに。
sudo chkconfig --add stunnel
sudo chkconfig stunnel on
telnet で stunnel に対して接続すると、下記のように無事、SMTPのレスポンスが返って来ることが確認できます。
$ telnet localhost 2525
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 email-smtp.amazonaws.com ESMTP SimpleEmailService-999999 XXXXXXXX
次に、Postfixをstunnel経由でSESにリレーする設定を行います。
まずは /etc/postfix/main.cf に下記を追加します。
#
# Amazon SES Setting
#
relayhost = 127.0.0.1:2525
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = may
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
下記の内容で /etc/postfix/sasl_passwd を作成します。
127.0.0.1:2525 アクセスキー:シークレットキー
下記コマンドで、上記パスワード情報を反映します。
sudo postmap hash:/etc/postfix/sasl_passwd
最後にPostfixのリスタートにより、設定を反映します。
sudo /etc/init.d/postfix restart
sudo chkconfig --add postfix
sudo chkconfig postfix on
これで、Postfix から SES へリレーしてメール送信が行われるよになります。以下、リレーを確認してみます。
$ sendmail -t -f info@xxx.com xxx@gmail.com
FROM:info@xxx.com
TO:xxx@gmail.com
SUBJECT:TEST MAIL
TEST
.
maillog を確認すると、下記のログが出力されており正常にSESにリレーされていることが判ります。
to=<xxx@gmail.com>, relay=127.0.0.1[127.0.0.1]:2525, delay=35, delays=33/0.03/0.77/0.72, dsn=2.0.0, status=sent
# 2017/10/23 追記
Amazon Linux をアップグレードすると stunnelが起動しない現象が発生する場合の対応を以下に記載しました。