Rails ActionMailer 便利小ネタ集

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

```ruby:
mail(from: '"表示名" <noreply@yoursite.com>')
```
defaultでの設定でももちろんOK。

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

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


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

```ruby: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' }
```
```ruby: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を適用。

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

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

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

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

```ruby: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と２つ作れば自動的に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](https://github.com/fphilipe/premailer-rails)

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