LoginSignup
226
194

More than 5 years have passed since last update.

Rails ActionMailer 便利小ネタ集

Last updated at Posted at 2014-08-04

送信者をメールアドレスでなく名前で表示する

送信者名がnoreply@yoursite.comみたいなメールアドレスではなく、名前を表示させるようにしたいですよね。
そんな時はfromをこんな風に設定。

mail(from: '"表示名" <noreply@yoursite.com>')

defaultでの設定でももちろんOK。

返信先アドレスの指定

送信は送信専用アドレスからで、お問い合わせ先は別にしたいような時は返信先も忘れずに設定。

mail(reply_to: 'support@yoursite.com')

メールにURLやassetへのリンクを埋め込む場合の設定

メール内のリンクやimage_tag、stylesheet_link_tagが相対パスになってしまい正しく表示されない。
そんな時はconfig/environments以下のdevelopment.rb,production.rbで以下のように設定。

config/environments/development.rb
config.action_controller.asset_host = 'http://localhost:3000'
config.action_mailer.asset_host = config.action_controller.asset_host
config.action_mailer.default_url_options= { host:'localhost:3000' }
config/environments/production.rb
config.action_controller.asset_host = 'http://yourhostname.com'
config.action_mailer.asset_host = config.action_controller.asset_host
config.action_mailer.default_url_options = { host: 'yourhostname.com' }

config.action_controller.asset_hostを設定するのは少し調べるとよく書かれていたけれど、rails4ではconfig.action_mailer.asset_hostも設定しないと正しくassetへの絶対パスを生成してくれなかった。

xxxx_pathはダメ!

link_toなどでパスを入れる際にnamed_routeを使う場合には xxxx_path でなく xxxx_url にする。
xxxx_pathだと相対パスに、xxxx_urlだと絶対パスになる。

<追記>
url_for も相対パスになるので、 polymorphic_url にする。
名前が紛らわしいけれどモデルのpolymorphic関連とは無関係なのでどのようなモデルでもpolymorphic_urlを適用。

メーラービューでヘルパーメソッドを使う方法

HogehogeMailer.rb
class HogehogeMailer < ActionMailer::Base
    add_template_helper(ApplicationHelper)
end

ActionMailer内でメールの送信を途中キャンセル

何らかの理由でActionMailer内でメール送信をキャンセルしたい。そんな時のための設定。
私のケースだと、twitterでoauth認証をしているためユーザーがメールアドレスを設定していない場合がありました。複数のメールメソッドが存在する場合、コントローラー側で上限設定するよりもActionMailer側でキャンセルできるようにする方が簡便です。

after_actionでperform_deliveriesをfalseにしています。

hogehoge_mailer.rb
class HogehogeMailer < ActionMailer::Base
    after_action :cancel_delivery_when_email_is_nil

    … 省略 …

    private
    def cancel_delivery_when_email_is_nil
        mail.perform_deliveries = false if @user.email.blank? # emailがからの場合は送らない
    end
end

スパム扱いされないためのメール設定

Content-typeはmultipart/alternativeで送信する

htmlメールのみ送信すると携帯メールなどで表示できないユーザーもいるしスパム扱いされやすくなります。multipart/alternativeは本文にhtmlとtextを両方含み、htmlで表示できない場合にはtextで表示します。

Railsではmailerにhogehogeというメソッドがあったら、viewにhogehoge.html.erb、hogehoge.text.erbと2つ作れば自動的にmultipart/alternativeにしてくれます。

Return-pathを設定する

サーバー側での設定が必要です。使っているメールサーバーによって設定方法が異なると思われます。

ちなみに私の使っているMandrillでの設定方法のガイド(参考)
http://help.mandrill.com/entries/25241243-Can-I-customize-the-Return-Path-bounce-address-used-for-my-emails-

SPFレコード、DKIM を設定する

(以下書き落としてました:2015/2/7追加)

  • DNSレコード設定でSPFレコードとDKIMを設定する:mandrillではSetting > Domainsで設定内容が確認できた
  • SPFレコードのみの設定だとGmail、yahooは届いたが、hotmailは届かなかった。DKIMも設定したらhotmailも届いた(2014年10月現在)

メールのCSSが壊れないようにするために

htmlメールを作る場合にCSSをheadタグ内で読み込んでいましたが、受信したメールのCSSが壊れており原因を確認したところ、多くのメールクライアントではhead内のタグを無視するということがわかりました。

これを回避するためには、インラインCSS(=body内の各タグにcssスタイルを書く)が確実ですが、これを手作業でやるのはとても大変です。

このインラインCSSを自動的に生成してくれる便利なgemがあったのでこれを利用しました。

premailer-rails

premailer-railsのgithub上の説明を見るとConfigなども色々あるのですが、特別変更点がなければgemをインストールすればhead内で読み込んでいるCSSをいい感じにインラインCSSにしてくれるので大変便利でした。
特別説明すべきこともないのでgemの紹介だけですが以上です。
(2016/4/15追記)

226
194
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
226
194