Rails&Heroku / Gmailを使わないでユーザーに一斉メール送信する
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]"
を省略すると、メールが送られなかった。
以上です。
開封率なんか自動で収集してくれるので、とても便利。