AWSに限らず、CentOSなんかで、メール送信をリレーサーバ経由にしたい場合にも使えます。
ロードバランサ配下のサーバにそれぞれEIPというかグローバルIPを割り当ててもいいのですが、
オートスケールをした場合グローバルIPが不定だったりして、SPFどうするんだ?という問題があります。
じゃぁAWSのSESつかうか。という方法が一番いい気がするのですが、バウンスメール処理をちゃんとしないといけないなど、結構手間な感じです。
GmailやSendGridなどをつかうのもいいのですが、手っ取り早く解決するにはメールサーバ用EC2を立てて、そこを中継させてあげればよさそうです。
また、その場合各サーバにはEIPを割り当てなくてもいい(別途SSH接続用踏み台サーバがいりますが)ので、セキュリティ面でもよさそうです。
まずは、メールリレーサーバにするEC2を用意します。
AmazonLinuxでは、デフォルトでSendMailが起動しています。初期設定では自分自身から送信のみできる状態になっています。
まずは、sendmailの設定である、sendmail.cfを作成するためのツールをインストールします。
yum -y install sendmail-cf m4
次に念のためsendmail.mc及びsendmail.cfのバックアップを取ったうえで、sendmail.mcの設定を以下のように修正します。
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
頭にdnlをつけてこの設定を無効化することにより、よそからのメール転送を許可するようになります。
しかし、このままですと、だれでもこのサーバを踏み台にメールを送れる要するにオープンリレーサーバ状態になりますので、リレーを受け付けるサーバを制限します。
なお、この設定はsendmail.mcに以下の記述がある前提になります。
FEATURE(`access_db',`hash -T<TMPF> -o /etc/mail/access.db')dnl
同じディレクトリ(/etc/mail/)にaccessというファイルがあります。(access.dbではありません)
これに
connect:10.0.0.100 RELAY
のように、リレーを許可するサーバのIPを列挙します。
調べた感じ、10.0.0.0/24のような指定はできないようですが、
connect:10.0.0. RELAY
のような指定はできるようです。
さて、ご存知の通り、sendmailはPostfixなどと違い、設定ファイルをコンパイル(?)しないといけません。
以下のコマンドを実行し、sendmail.cfファイルを作成します。
m4 /etc/mail/sendmail.mc > /etc/sendmail.cf
作成したら、sendmailを再起動させ、設定を有効化します。
/etc/rc.d/init.d/sendmail restart
では、実際にリレーメールサーバにメールを送信し、リレーされることを確認します。
自分はお手軽にrubyでメール送信プログラムを作成しました。
# -*- encoding: utf-8 -*-
require 'mail'
mail = Mail.new
options = { :address => "10.0.0.20", #リレーメールサーバのIP
:port => 25,
:authentication => :plain,
:enable_starttls_auto => true }
mail.charset = "utf-8"
mail.from "test@example.com"
mail.to "hogehoge@gmail.com"
mail.subject "タイトル"
mail.body "本文"
mail.delivery_method(:smtp, options)
mail.deliver
これをリレーする元サーバ、つまりaccessファイルで許可したサーバ内で実行します。
DNSの設定やSPFの設定が正しければ、メールが届いているはずです。
ちゃんと中継されたかはメールのヘッダ情報にリレーメールサーバのIPが記録されているはずですので、そこで確認する事が出来ます。
0 件のコメント:
コメントを投稿