Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails - Use same attachment for all emails using layout

I'm probably missing something obvious, but I've got a logo I'd like to include in all of the emails I send from my app. I have a master layout I'm using for all of those Mailers. I assume there's a way to do keep it DRY and not have to add the line of code to attach the file in every mailer method. Can someone point me in the right direction or correct my line of thought.

Thanks!

like image 269
dbwinger Avatar asked Feb 25 '11 02:02

dbwinger


2 Answers

Callbacks using before_filter and after_filter will be supported in a future Rails release:

http://github.com/rails/rails/commit/4f28c4fc9a51bbab76d5dcde033c47aa6711339b

Since they will be implemented using AbstractController::Callbacks, you can do the following to mimic the functionality that will be present in ActionMailer::Base once Rails 4 is released:

class YourMailer < ActionMailer::Base
  if self.included_modules.include?(AbstractController::Callbacks)
    raise "You've already included AbstractController::Callbacks, remove this line."
  else
    include AbstractController::Callbacks
  end

  before_filter :add_inline_attachments!

  private
  def add_inline_attachments!
    attachments.inline["footer.jpg"] = File.read('/path/to/filename.jpg')
  end
end

This includes the module that will be used in a future rails version, so the callback hooks available to you will be the same to ensure future compatibility. The code will raise when you try to upgrade to a Rails version that already includes AbstractController::Callbacks, so you will be reminded to remove the conditional logic.

like image 79
Justin Leitgeb Avatar answered Sep 29 '22 11:09

Justin Leitgeb


I hacked a little something, it's not ideal, but it works.

If you use

default "SOMEHEADER", Proc.new { set_layout }

And then define set_layout

def set_layout
  attachments.inline["logo.png"] = File.read("logopath.png")
  attachments.inline["footer.jpg"] = File.read("footerpath.png")
  "SOME HEADER VALUE"
end

Then because set_layout gets called to set the header, it also adds the inline attachments. It basically creates a callback for adding attachments.

An actual callback system in ActionMailer would be preferable, but this works too.

Thought I would share since I was looking for this answer on this question earlier today.

like image 31
jesse reiss Avatar answered Sep 29 '22 11:09

jesse reiss