送信者をメールアドレスでなく名前で表示する
送信者名が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.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.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を適用。
メーラービューでヘルパーメソッドを使う方法
class HogehogeMailer < ActionMailer::Base
add_template_helper(ApplicationHelper)
end
ActionMailer内でメールの送信を途中キャンセル
何らかの理由でActionMailer内でメール送信をキャンセルしたい。そんな時のための設定。
私のケースだと、twitterでoauth認証をしているためユーザーがメールアドレスを設定していない場合がありました。複数のメールメソッドが存在する場合、コントローラー側で上限設定するよりもActionMailer側でキャンセルできるようにする方が簡便です。
after_actionでperform_deliveriesをfalseにしています。
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のgithub上の説明を見るとConfigなども色々あるのですが、特別変更点がなければgemをインストールすればhead内で読み込んでいるCSSをいい感じにインラインCSSにしてくれるので大変便利でした。
特別説明すべきこともないのでgemの紹介だけですが以上です。
(2016/4/15追記)