ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

メールが送れているか確認したいけど自分の持っているメールアドレスに向けて送るのは…という方向けのGem「MailCatcher」

メールを送る動作をするときの確認ってどうしてますか?
アカウントを持っているどこかのメールサーバーを使って送ったりしていませんか?私もそうしてました。
でもそれだと、

  • 正しく送れているはずなのにメールが来ない
  • と思ったら迷惑メールフォルダーに突っ込まれていたというオチがつく、かもしれない
  • ネットにつながっていないと確認できない
  • いくつものメールアドレスで確認を取るのがめんどくさい
  • うっかり設定ファイルをコミットして(以下省略

なんて可能性があります。そこで、これを一気に解決してくれるかもしれないGem「MailCatcher」を使ってみました。実はだいぶ前にも使ってみようと思ったのですがなぜか使えず、あの手この手を尽くした結果ホームディレクトリからの相対パスを入力してやることで使えたのでメモです。

インストール

gem install mailcatcher

以上。Gemなのでこれで済みます。楽ですね。

つかい方

$ mailcatcher
Starting MailCatcher
==> smtp://127.0.0.1:1025
==> http://127.0.0.1:1080
*** MailCatcher runs as a daemon by default. Go to the web interface to quit.

これだけ。MailCatcherは既定ではデーモンとして裏で起動してくれます。このあと、localhost:1080にブラウザでアクセスすると…
f:id:yuu_xxxx:20130919220333p:plain
こんな感じのメーラーっぽい画面が表示されると思います。普通のメーラーと違うところといえば、toが表示されていることくらいでしょうか。試しにメールを送ってみましょう。
f:id:yuu_xxxx:20130919220341p:plain
すると、こんなかんじにプッシュされてきます。

使い方を見ていて思った人もいたはず

「つまりこういうことか?『このGemはRubyのプログラム以外でも使える・・・・・・・・・』」

.V///    ___l        _
  V/,、ィf二三'iニニ|,         |_    ┐   _l_ l
   .〉|l、 l `゚=/ :i./.       |_ Х □_ 匚 L | У
  //'i'f `  ヽr>      
 -〈三_=\ ヾ=/       ( その通りでございます )
 ‐- 、,  ̄''ヾニ゙
    `   ゙` 

ちなみにRailsで使いたい場合は

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = { :address => "localhost", :port => 1025 }

をconfig/environments/development.rbに追加すればOK。PHPの場合は

SMTP = localhost
smtp_port = 1025
sendmail_path = "/usr/sbin/sendmail -t -i"

php.iniに書き込めばいいようです。

Djangoの場合は環境設定で「EMAIL_PORT」を1025にするだけでいいようで、他は既定値でも大丈夫です。

# 設定ファイルに書き足す
EMAIL_PORT = 1025

# あとはいつもどおり
from django.core.mail import send_mail

send_mail('Subject here', 'Here is the message.', 'from@example.com',
    ['to@example.com'], fail_silently=False)

電子メールの送信 — Django v1.0 documentation

node.jsの場合はNodemailerを使って、

var mailer = require("nodemailer");

var mailOptions = {
    from: "test@example.com",
    to: "test@hogehoge.com",
    subject: "こちら、幸福安心委員会です。",
    html: "幸せすぎて、恐いわー。"
}

var smtp = mailer.createTransport("SMTP", { port: 1025 }); // ポートだけ設定すればOK

smtp.sendMail(mailOptions, function(error, response) {
    if (error) {
        console.log(error);
    } else {
        console.log("Message sent: " + response.message);
    }
    smtp.close();
});

みたいな感じでやるとよさげです*1
andris9/Nodemailer · GitHub

*1:ちなみに「こちら、幸福安心委員会です。」はPVに出てくるミク(小説では「サイレン」という名前らしい)のアレな目と棒読みのセリフが地味に恐い