Rails&Heroku / Gmailを使わないでユーザーに一斉メール送信する

Shunsuke Sawada

Railsアプリからウェブサイトの登録ユーザー宛に、メールを送信する際に、Gmailを使ったらそっこうでアカウントをロックされたので、別の手段を取ることに。

Gmailは、自分のログインしたことのない場所で、何者かがログインを試みようとすると警告を出してきます。よく海外を移動する身としては、毎回確認されてイラっとすることも。クレジットカード会社も同じようなことをやってますよね。
  
で、今回はRailsアプリからGmail経由でメール送信しようと思ったんですが、Heroku(ヨーロッパリージョン)に乗っているので、ヨーロッパから大量の不正ログインがあったと判断され、強制的にパスワードのリセットを求められました。
Gmailの親切機能ですが、アプリで使うのは無理だ…ということで他の方法は…
  
普通にHerokuのadd-onに選択肢がけっこうありますね。
  

Mandrill

あのMailChimpによって提供されているのは、Mandrillというadd-on。
12,000通/月まで無料です。
今のところ十分なので、これでいくことにしました。

自分のアプリにadd-onを追加すると、SMTPユーザーネームとSMTPパスワードが取得できるので、それを使って、Railsを設定。

config/environments/production.rb  

ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  # For Mandrill
  config.action_mailer.raise_delivery_errors = false
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :address   => "smtp.mandrillapp.com",
    :port      => 587, 
    :enable_starttls_auto => true,
    :user_name => "[email protected]",
    :password  => "xxxxxxxxxxxxxxxxxxxxx", 
    :authentication => 'login', 
    :domain => 'heroku.com', 
  }

これでサクッとメールが送信できる。
controllerやmailerの処理は基本変えなくていいんですが、一点だけ、変更しないとメールが送られなかったので、メモ。

mailers/your_mailer.rb

ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class YourMailer < ActionMailer::Base

  def my_mail(user)
    @user = user
    begin
      mail to: user.email,
           subject: "#{user.name}さん、こんにちは!",
           from: "[email protected]"
    rescue => e
      puts "エラー : #{e.message}"
    end
  end
end

from: "[email protected]" を省略すると、メールが送られなかった。

  
以上です。
開封率なんか自動で収集してくれるので、とても便利。

Screen Shot 2014-05-28 at 1.36.35 PM

参考

Using Mandrill's SMTP integration with Web Frameworks

Mandrill by MailChimp

69
Shunsuke Sawada

おすすめの記事

オーストラリア66分の1を一週間で旅行してきた。
justhostがハッキングされてる件
海外でクレジットカードを使ってATMを使うとリボ払いなのね。。。