ActionMailer PDF attachment and Windows

Discussion in 'Ruby' started by dkmd_nielsen, Dec 14, 2009.

  1. dkmd_nielsen

    dkmd_nielsen Guest

    I've been struggling for a couple of days down with trying to attach a
    pdf file to an email using ActionMailer on Windows. All the examples
    on the web I could find instructed me to use ":body => File.read
    (<filename>)" to do the attachment. The attached file was always
    corrupt. I attempted to simply copy the file using File.read
    (<filename>), and the copy too yielded a truncated file.

    What just now worked for me was a different body syntax. What works
    is the following: ":body => File.new(fattach,'rb').read()". I don't
    exactly understand the significance of the of the difference. Nor do
    I understand why the original example above works in Linux but not
    Windows, and why the latter example works in Windows. But it does
    work. I just want to get discussion on the web in case someone else
    encounters the same problem, and this provides an alternative
    solution.

    class Emailer < ActionMailer::Base
    def report_attachment(to,cc,bcc,from,subject,body,fattach)
    pp to,cc,bcc,from,subject,body,fattach
    recipients to
    cc cc
    bcc bcc
    from from
    subject subject
    body body

    attachment :content_type => "application/pdf",
    :content_disposition => "attachment",
    :filename => File.basename(fattach),
    :body => File.new(fattach,'rb').read()

    end
    end
     
    dkmd_nielsen, Dec 14, 2009
    #1
    1. Advertising

  2. On Mon, Dec 14, 2009 at 1:56 PM, dkmd_nielsen <> wrote=
    :
    > I've been struggling for a couple of days down with trying to attach a
    > pdf file to an email using ActionMailer on Windows. =A0All the examples
    > on the web I could find instructed me to use ":body =3D> File.read
    > (<filename>)" to do the attachment. =A0The attached file was always
    > corrupt. =A0I attempted to simply copy the file using File.read
    > (<filename>), and the copy too yielded a truncated file.
    >
    > What just now worked for me was a different body syntax. =A0What works
    > is the following: =A0":body =3D> File.new(fattach,'rb').read()". =A0I don=

    't
    > exactly understand the significance of the of the difference.


    When using Ruby 1.8 on Windows (and everywhere on Ruby 1.9 -- for a
    different reason), if you want to work with binary files, File.read()
    is never safe. You need to tell Ruby you're working with a binary
    file by using the "rb" access mode. But you might consider doing it
    this way:

    File.open(filename, "rb") { |f| f.read } so that your file handle is
    closed properly. On Ruby 1.9, File.binread(filename) can also be
    used.

    -greg
     
    Gregory Brown, Dec 15, 2009
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. enspired
    Replies:
    3
    Views:
    208
    enspired
    Jul 28, 2005
  2. Kevin Brown

    ActionMailer

    Kevin Brown, Nov 20, 2005, in forum: Ruby
    Replies:
    2
    Views:
    97
    Jeremy Kemper
    Nov 20, 2005
  3. Replies:
    0
    Views:
    210
  4. Ricardo Pog
    Replies:
    1
    Views:
    434
    Austin Ziegler
    Mar 26, 2008
  5. Pablo Q.
    Replies:
    1
    Views:
    146
    Pablo Q.
    Aug 22, 2008
Loading...

Share This Page