Rails 3 ActionMailer отправляет вложения 0 байт в формате PDF

Мне удалось отправить электронное письмо с вложениями в формате PDF, которые хранятся на s3

def welcome_pack1(website_registration)
      require 'open-uri'
      @website_registration = website_registration
      email_attachments = EmailAttachment.find(:all,:conditions=>{:goes_to_us=>true})

      email_attachments.each do |a|
        tempfile = File.new("#{Rails.root.to_s}/tmp/#{a.pdf_file_name}", "w")
        tempfile << open(a.pdf.url)
        tempfile.puts
        attachments[a.pdf_file_name] = File.read("#{Rails.root.to_s}/tmp/#{a.pdf_file_name}")
      end

      mail(:to => website_registration.email, :subject => "Welcome")
  end

Вложения прикреплены к письму. Но они проходят как 0 байт. Я использовал пример, опубликованный здесь скрепка + ActionMailer - Добавление вложения?. Я что-то упускаю?


person DickieBoy    schedule 13.07.2012    source источник


Ответы (1)


Файловые объекты буферизуются - пока вы не закроете файл (а вы этого не сделаете), записанные вами байты могут отсутствовать на диске. Отличный способ не забыть вызвать close — использовать блочную форму:

File.open(path, 'w') do |f|
  #do stuff to f
end #file closed for you when the block is exited.

Я не уверен, почему вы вообще используете файл - почему бы и нет

attachments[a.pdf_file_name] = open(a.pdf.url)
person Frederick Cheung    schedule 13.07.2012
comment
Файловые вложения в сообщениях электронной почты не должны храниться локально, чтобы их можно было прикрепить? Ваше второе предложение дает ошибку: неопределенный метод `[]' - person DickieBoy; 13.07.2012
comment
Нет - вы можете предоставить файл или просто предоставить данные (что вы и делали в любом случае, так как вы вызываете File.read - почтовая программа действий не знает, откуда пришли байты). Не знаю, почему вы получили эту ошибку без дополнительной информации. - person Frederick Cheung; 13.07.2012