Archive

Posts Tagged ‘postfix’

Macのローカル開発環境にメールの送信テストをするための環境を構築するまとめ

December 14th, 2011 No comments

概要

Web系のシステムを作っていると、ユーザのアクティベーションのためにメールを送ったり、 何らかのイベントが起きたときに通知メールを送ったりなど、メール送信を絡めた機能がちょくちょく必要になります。 ステージング環境にはテスト用のメールサーバを動かしているプロジェクトも多いですが、ローカル開発環境まで面倒をみてくれることはまれです。Macならメールサーバを比較的簡単に導入できるので、Macを開発機に使ってる人はメール送信テスト用の環境を作ることをお勧めします。

諸注意

メールサーバを起動した状態でメール送信機能を起動すると当然ながら、メールが宛先となっているメールアドレスまで飛んでいってしまいます。手順の中でメールサーバをローカル配信限定の設定にしてインターネット側にメールが飛ばないようにしていますが、万が一ということもありうるので、リアルなメールアドレスはなるべく使わないようにしましょう。

メールサーバの起動/再起動/停止

メールサーバには postfix を使います。基本的なコマンドは次の通り。

$ sudo postfix start
$ sudo postfix reload
$ sudo postfix stop

メール送信

まずはメールサーバの動作チェックをするために自分のメールアドレスにメールを送信してみます。postfix を起動してメールを送信してください。メールを送信するには mail コマンドを使います。

$ mail -s 'subjects' mail@example.com
メールテストです。入力がそのまま本文になります。
「CTRL + D」キーを押すと本文入力終了です。
CTRL + D

「-s」でサブジェクトを、その後に送信先のメールアドレスを指定します。 本文を入力し、「CTRL + D」キーを押すと本文の入力が終了しメールが送信されます。 メールボックスを確認するとメールが届いているはずです。(GMailにはスパムメール扱いされる可能性が高いです)

ローカル配送専用設定

メールの送信テストができたらメールサーバをローカル配信専用に設定します。 僕の環境では次の設定を加えると外部にメールが飛ばなくなりました。 設定にはあんまり自信がないので各自要チェックお願いします。

/etc/postfix/main.cf

mynetworks_style = host
relayhost = $mydomain

設定できたら postfix を再起動します。 mailコマンドを使ってメールが外部に飛ばないことを確認しましょう。

$ sudo postfix reload

メールキューの確認

飛ばしたメールはメールキューに溜まっていくのでとりあえずメールキューを見てみましょう。

$ mailq

一覧表示されたと思います。

キューの内容確認

メールキューの内容を確認してみましょう。 -q のオプションにはメールキュ一覧から取得できるキューIDを指定します。

$ sudo postcat -q AF5F92D2547

メールが表示されたと思います。

キュー削除

メールキューがたくさん溜まりすぎるとあまりよろしくないので適当なタイミングで削除しましょう。 キューIDを指定して削除したり、一括で削除することもできます。

$ sudo postsuper -d AF5F92D2547
$ sudo postsuper -d ALL

ISO-2022-JP メールの表示

メールキューの内容を確認したときに気づいたかもしれませんが、ISO-2022-JPでエンコードされたメールは文字化けして表示されます。文字化けせずに表示するには、文字コード変換プログラムのnkfを使います。

$ brew install nkf
$ sudo postcat -q AF5F92D2547 | nkf -m

文字化けせずに表示されましたね!

送信されたメールを流し続ける

とりあえず送信されたメールを文字化けせずに表示するところまでできました。 ここまででもテスト自体は可能ですが、メールを送信するたびに postcat するのは面倒です。 メールが送信されてきたらメールの内容をダダ流しできるようにしましょう。

ポイントは次の3つです。

  • 開発時はメールの送信先がすべて root@localhost になるようにシステムを改修する
  • root に届いたメールを自分のメールボックスに転送する
  • 自分のメールボックスを tail -f で監視する

開発時はメールの送信先がすべて root@localhost になるようにシステムを改修する

システムによりまちまちだと思いますが、CakePHPなら次のように実装することができます。app/config/core.php に実行環境を定義する環境変数を設定して、メール送信時に環境を判別して開発環境ならメールの送信先が root@localhost に上書きされるようにします。

app/config/core.php

Configure::write('environment', 'development');

app/controllers/components/user_mail.php

$environment = Configure::read('environment');
if ($environment == 'development') {
  $mail = 'root@localhost';
}

root に届いたメールを自分のメールボックスに転送する

root 宛のメールが自分のメールボックスに転送されるようにエイリアスを設定します。

/etc/postfix/aliases

#root:           you
root:            cohakim

エイリアスを設定したら、エイリアスファイルを再構築して postfix を再起動します。

$ sudo newaliases
$ sudo postfix reload

自分のメールボックスを tail -f で監視する

/var/mail/USER_NAME が自分のメールボックスになります。
nkf -u で出力をバッファせずにすぐに出力させることができます。

$ tail -f /var/mail/cohakim | nkf -u -m

終わりに

以上でローカルにメールのテスト環境を構築できたと思います。
Macを使うと簡単ですね。Windowsの人は頑張れ!

Categories: 02.Article Tags: ,