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. / 日本語が含まれない投稿は無視されますのでご注意ください。