今回は、Postfixを利用してAmazon Simple Email Service (Amazon SES)からメール配信出来る仕組みを構築してみました。
簡単に図にしてみると、以下のようなものになります。

まず始めるにあたりAmazon Simple Email Service (Amazon SES)にてSESの申し込みをします。

しばらくすると、下記のようなメールが届いて、利用が可能になります。


Dear Amazon SES customer:

We have received a request to authorize an email address for use
with Amazon SES. To confirm that you are authorized
to use this email address, please go to the following URL:

https://email-verification.us-east-1.amazonaws.com/?XXXXXXXX

Your request will not be processed unless you confirm the address using this URL.

To learn more about sending email from Amazon SES,
please refer to the Amazon SES Developer Guide.

Sincerely, Amazon Web Services

そして、「SESを使ってみた(AWS)」で紹介したように、Amazon Simple Email Service Scriptsを利用可能にします。
(ちなみに最新のスクリプトでは、以下の日本語対策も反映されています)

Amazon SES Developer Tools 付属の ses-send-email.pl で日本後が化けるのは、スクリプト中で「binmode STDIN, “:utf8”;」を書いておけば回避できますた。単純にマルチバイト環境を想定していなかったのかな #jawsugless than a minute ago via TweetDeck前佛 雅人(M.Zembutsu)
zembutsu


ちなみに今回は、下記のようなディレクトリ構造でインストールしています。
(利用するには適宜にCPANモジュールを入れる必要もあります。)

Amazon Simple Email Service Scriptsが利用可能になったら、次はPostfixの設定です。

まず、下記でインストールと自動起動まで行っておきます。

# yum -y install postfix
# chkconfig postfix on

そして下記のように、/etc/postfix/master.cfと/etc/postfix/master.cfを修正し、Postfixがメール送信をSESにて行うようにします。

【master.cf】

...
#
# Amazon SES
#
ses       unix  -       n       n       -       -       pipe
  flags=R user=nobody argv=/opt/aws/ses/bin/ses-send-email.pl -r -k /opt/aws/ses/etc/credential.conf -f ${sender}

【main.cf】

...
#
# Amazon SES
#
default_transport = ses

この状態で、Postfixを下記のようにスタートすれば、

# /etc/init.d/postfix start

このPostfixで処理されたメールは、SESで送信されるはずです。

実際に「CentOSでPostfixのインストール&apm;確認」で紹介したtelnetを利用した方法にて
送信の確認をしてみましたが、メールログに下記のようなエラーが出力されてしまいました。

【maillog】

...
Command died with status 2: "/opt/aws/ses/bin/ses-send-email.pl".
Command output: Can't locate SES.pm in @INC (@INC contains:
/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8
/usr/lib/perl5/vendor_perl
/usr/lib/perl5/5.8.8/i386-linux-thread-multi
/usr/lib/perl5/5.8.8
.) at /opt/aws/ses/bin/ses-send-email.pl line 27.
BEGIN failed--compilation aborted at /opt/aws/ses/bin/ses-send-email.pl line 27.
...

「Perlのライブラリディレクトリに”SES.pm”がない」というエラーなので、下記のようにシンボリックリンクを張ります。

# pwd
/usr/lib/perl5/site_perl
# ln -s /opt/aws/ses/bin/SES.pm SES.pm

再び同様のテストを行うと、今度は下記のようなエラーが発生しました。

【maillog】

...
Command died with status 1: "/opt/aws/ses/bin/ses-send-email.pl".
Command output: Missing required header 'Subject'.
...

今度は、「メールヘッダにSubjectがない」というエラーなので、
テスト時にSubjectの記述を追加しました。
【telnet localhost 25】

DATA
354 End data with .
Subject: test

test
.

すると、今度は次のようなエラーに変わりました。

【maillog】

...
Command died with status 1: "/opt/aws/ses/bin/ses-send-email.pl".
Command output: User name is missing: 'undisclosed-recipients:;'.
...

これは、「Toが正しくない」というエラーなので、
テスト時にToの記述を追加しました。
【telnet localhost 25】

DATA
354 End data with .
Subject: test
To: suzuki@suz-lab.com

test
.

これで、ログが以下のようになり、
正しくメールを送信することができるようになりました。
【maillog】

...
to=,
relay=ses,
delay=441,
delays=439/0/0/1.3,
dsn=2.0.0,
status=sent (delivered via ses service)
...

最後に、Request for Production Access to Simple Email ServiceからProduction Accessの申請を行い、申請が通れば、任意のメールアドレスにメールを送信することが可能となります。

次回は、リレーの設定まで行ってみようと思います。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら