はじめに
サテ皆さん、sendmailしてますか?
最近、とあるメール送信処理を修正をすることになったのですが、困ったことにその実装が
sendmailコマンドを直接叩く
というものでした。
これをローカル側でテストするときに一番やっかいです。というのも、sendmailは同時にデーモンが動いていて、こっちが「やるなよ!やるなよ!」と思っていても、賢いsendmail様はメールをちゃんと相手に届けてくれます(設定によってはアレだが)。
ローカルでテストしてるときはメールを外に出したくない
じゃないですか!
デプロイする時の心配を一つでも省きたい
じゃないですか! ポート番号の書き換えを忘れて、会社の上長やテスト担当、客先の人々に怒られたくないですよね! だからこそ
コードを変えることなくテスト環境を整える
のです。
というわけで、なんとかしてsendmailを使って外に出ないメールを出したいという悪戦苦闘の結果を共有したいと思います。
前提
今回おこなうのに必要な前提は以下のとおりです。少し違う環境の時は、逐次脳内変換しておいてくださいませ(全部が全部サポートできません故…)。
- 使ってるOSはUbuntu14.04だぜ!
- sendmailは普通に入ってるぜ!
- sendmailコマンドを叩けば普通にメールが送れるぜ!
- postfix?知らない子ですね(できればMTAとかはsendmailのみにしておきます)
- rubyも入ってるぜ!
- 当方はrbenvで2.4.0入れた状態で解説してるぜ!
- Pythonでもええけどそのときは逐次置き換えてね!
- sudo -s でrootになれるぜ!
やり方
では、早速、実行方法を伝授いたします。順を追って解説していきます。
mailcatcherを導入
ではまず、送られたメールをキャッチして外に出さないRubyのgemを導入します。
$ gem install mailcacther --no-ri --no-rdoc
インストールが終われば、mailcatcherコマンドを起動確認します。そのまま起動すると、デーモンとして立ち上がるので、-fオプションで楽に動作適しできるようにしておきましょう。
$ mailcacther -f
Starting MailCatcher
==> smtp://127.0.0.1:1025
/home/***/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/thin-1.5.1/lib/thin/server.rb:104: warning: constant ::Fixnum is deprecated
==> http://127.0.0.1:1080
2.4.0で動かしているのでFixnum使うなヨーというメッセージが出ていますが、無視しましょう。
動いたのを確認したら、Ctrl-Cで停止します。
Sendmailのデーモンを停止
先のmailcactherには、標準では1025がSMTPポートになりますが、オプションでポート番号を変えられるので、そのままオプション指定で起動…と思ったらそうは問屋が卸さない。すでにsendmailのデーモンが25番ポートを専有しています。
なので、このデーモンを切っちゃいましょう。ubuntuの場合、rootになってsystemctlコマンドを使います。
# systemctl stop sendmail
…え、sendmailコマンドはデーモン見てるんじゃないかって? それは無いと思います。実際この状態でコマンドを叩いても影響はありませんでした。特に、sendmailのバックにpostfixが動いている場合もありますしね…ていうか、これで動かかなかったら記事にできません…
しばらくテストをするつもりでしたら、無効化するのも手です。デーモン停止後に以下のコマンドを実行します。
# systemctl disable sendmail
これで、mailcatcherを起動する準備ができました。
Mailcatcherを起動する
では、25番ポートを指定して、mailcatcherを起動します。25番ポートはroot権限がないと開けないので、sudoでルートになっておいてから起動します
# sudo -s
# mailcatcher --smtp-port 25
Starting MailCatcher
==> smtp://127.0.0.1:25
/home/***/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/thin-1.5.1/lib/thin/server.rb:104: warning: constant ::Fixnum is deprecated
==> http://127.0.0.1:1080
*** MailCatcher runs as a daemon by default. Go to the web interface to quit.
さあ、これでメールを送れる状態になりました。
ブラウザを開く
お好みのブラウザを開いて、URLを指定します。
http://127.0.0.1:1080
これは、メーラーが送ってきたメールが表示され、テスト結果の確認に大いに役立ちます。
実際にメールを送る
あとは、メールを送って、ちゃんと結果が出るか見てみます。
$ echo Meaow3! | sendmail hoge@fuga.com
ブラウザに、hoge@fuga.comに送ったメールが表示されれば成功です! お疲れ様でした!
まとめと謝辞
テストする時は、デプロイする際の影響を最低限にしたいもので、だからこそ、人は試行錯誤するもんだと感慨にふけっております。もちろん、たくさんのテストのうちの氷山の一角ですが、これがデプロイミス減少に役立てられたら非常に嬉しく思います。
この問題で色々アドバイスを頂いた、shinosaka.rbの皆さんに感謝!
それではHappy Hacking!