28

In rails3 w ActionMailer, I want to send a .txt file attachment. The challenge is this txt file does not exist but rather I want to create the txt file given a large block of text that I have.

Possible? Ideas? Thanks

AnApprentice
  • 108,152
  • 195
  • 629
  • 1,012

2 Answers2

72

It's described for files in the API documentation of ActionMailer::Base

class ApplicationMailer < ActionMailer::Base
  def welcome(recipient)
    attachments['free_book.pdf'] = File.read('path/to/file.pdf')
    mail(:to => recipient, :subject => "New account information")
  end
end

But that doesn't have to be a File, it can be a string too. So you could do something like (I'm also using the longer Hash-based form where you can specify your own mimetype too, you can find documentation for this in ActionMailer::Base#attachments):

class ApplicationMailer < ActionMailer::Base
  def welcome(recipient)
    attachments['filename.jpg'] = {:mime_type => 'application/mymimetype',
                                   :content => some_string }
    mail(:to => recipient, :subject => "New account information")
  end
end
Marten Veldthuis
  • 1,870
  • 1
  • 16
  • 15
  • Thanks, that worked, but the attachment is showing up at the top of the message. and not at the bottom, ideas? – AnApprentice Feb 28 '11 at 18:36
  • Afraid not, that shouldn't happen I think. Maybe something to do with the mimetype of your attachment? – Marten Veldthuis Mar 01 '11 at 09:10
  • If you want your attachment to appear at the bottom instead of the top, try this answer: http://stackoverflow.com/a/10787533/196918 – Jackson Miller May 28 '12 at 16:11
  • 29
    Something gives me the jeebies about an API where you create the attachments but never add them to the mail... I wish the attachments were at least passed into the mail method call... – Hakanai Oct 05 '12 at 01:08
  • 4
    @Trejkaz Completely agree. It's strange because if you create a `Mail::Message` object, you can add attachments to it: `ActionMailer::Base.mail( from: ..., to: ... ).attachments['filename.jpg'] = some_string` – Joshua Pinter Apr 25 '15 at 15:20
  • Is it possible to do something similar and attach html files? – Christian Jan 10 '22 at 22:03
4

First the method to send email

class ApplicationMailer < ActionMailer::Base
   def welcome(user, filename, path)
      attachments[filename] = File.read(path)
      mail(:to => user.email, :subject => "New account information")
   end
end

Call the method with the params

UserMailer.welcome(user, filename, path).deliver
  • I think this does not answer the real question: `The challenge is this txt file does not exist but rather I want to create the txt file given a large block of text that I have`. – MrBean Bremen Mar 11 '20 at 18:22