ActionMailer PDF attachment and Windows

D

dkmd_nielsen

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
 
G

Gregory Brown

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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top