PostfixからAmazon SESにリレーしてメール送信

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が起動しない現象が発生する場合の対応を以下に記載しました。

stunnelを利用せずPostfixからSESにリレーしてメール送信

コメントを残す

コメントは当サイト運営者の承認後に反映されます。
お名前はニックネームでも結構です。

Comments are allowed only in Japanese. / 日本語が含まれない投稿は無視されますのでご注意ください。