okochangの馬鹿でありがとう

ふらふら適当に世間を生きる日々でございます

Amazon SESをSMTPインターフェースとして使う時のまとめ

f:id:okochang:20120503170729p:plain
油断をしていたら6月に更新をしていないようなので、作業メモで更新。
Amazon SESはSDKなどを使って直接メール送信する方法と、SMTPインターフェースを使用して送信する方法があります。
SDKを使ってメール送信をする方法はこちらのブログで紹介されているので、今回は後者の方法でメールを送信してみます。

Amazon SESの設定

まずSESで送信元となるメールアドレスは以下のようにVerified Sendersに登録しておいて下さい。
※SESがプロダクション環境でない場合は受信先メールも登録する必要があります
f:id:okochang:20120630191608p:plain
次に以下のようにSMTP Credentialsを作成します。
f:id:okochang:20120630191629p:plain
SMTP CredentialsはIAMによって提供されていますので、IAMのユーザー名を指定します。
f:id:okochang:20120630191637p:plain
IAMのユーザー名を指定すると以下のようにSMTPユーザーとパスワードが発行されます。
f:id:okochang:20120630191644p:plain

プログラムから使ってみる

先ほどのユーザーとパスワードを使用すると簡単にプログラムでメール送信が出来ます。
ruby1.9.2で動作確認をしています

Postfixと連携してみる

さらに以下のように設定してPostfixからリレーさせてメール送信する事も出来ます。

①必要なパッケージのインストール

$ sudo yum -y install mailx postfix stunnel system-switch-mail
$ sudo system-switch-mail 
postfix

②Stunnelの設定

$ sudo vi /etc/stunnel/stunnel.conf
$ cat /etc/stunnel/stunnel.conf 
[smtp-tls-wrapper]
accept = 2525
client = yes
connect = email-smtp.us-east-1.amazonaws.com:465
$ sudo stunnel /etc/stunnel/stunnel.conf

Postfixの設定(その他のセキュリティ設定は別途行って下さい)

$ sudo cp /etc/postfix/main.cf /etc/postfix/main.cf-orig
$ sudo vi /etc/postfix/main.cf
$ diff -u /etc/postfix/main.cf-orig /etc/postfix/main.cf
--- /etc/postfix/main.cf-orig	2012-07-01 01:22:14.106737598 +0000
+++ /etc/postfix/main.cf	2012-07-01 01:42:24.660972013 +0000
@@ -74,6 +74,7 @@
 #
 #myhostname = host.domain.tld
 #myhostname = virtual.domain.tld
+myhostname = mail.okochang.com
 
 # The mydomain parameter specifies the local internet domain name.
 # The default is to use $myhostname minus the first component.
@@ -110,10 +111,10 @@
 #
 # Note: you need to stop/start Postfix when this parameter changes.
 #
-#inet_interfaces = all
+inet_interfaces = all
 #inet_interfaces = $myhostname
 #inet_interfaces = $myhostname, localhost
-inet_interfaces = localhost
+#inet_interfaces = localhost
 
 # Enable IPv4, and IPv6 if supported
 inet_protocols = all
@@ -674,3 +675,12 @@
 # readme_directory: The location of the Postfix README files.
 #
 readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES
+
+#
+# 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
$ sudo vi /etc/postfix/sasl_passwd
$ cat /etc/postfix/sasl_passwd 
127.0.0.1:2525 YOUR_SMTP_USERNAME:YOUR_SMTP_PASSWORD
$ sudo postmap hash:/etc/postfix/sasl_passwd
$ rm /etc/postfix/sasl_passwd
$ sudo service postfix restart

④Verified Senderの登録
冒頭で記載したように、SESでメールを送信する為にはVerified Sendersに登録する必要があります。
今回は構築したメールサーバをmail.okochang.comのMXとして名前解決出来るようにしました。
その後、先ほどと同じようにVerified Senderで送信するメールアドレスを登録します。
f:id:okochang:20120701115550p:plain

AWSから送信されたメールに記載されているURLにアクセスして検証を完了させます。
f:id:okochang:20120701115620p:plain

⑤動作確認
以下のようにPostfixを経由してメールを送信します。
※Verified Senderに登録したec2-userから実行しています

$ mail -s testmail1 hoge@example.com

まとめ

Postfixと連携させると、アプリケーションからはローカルにあるメールサーバと同じように使えます。
インスタンスを増やす場合でも逆引き設定などを追加する必要がないので楽ちんですね。