2010-12-05 3 views
3

Кажется достаточно простым, но я не смог заставить его работать. Файлы отлично работают с S3 в веб-приложении, но когда я отправляю их по электронной почте с помощью приведенного ниже кода, файлы повреждаются.ActionMailer - Как добавить вложение?

App Stack: рельсы 3, Heroku, скрепка + s3

Вот код:

class UserMailer < ActionMailer::Base 
# Add Attachments if any 
if @comment.attachments.count > 0 
    @comment.attachments.each do |a| 
    require 'open-uri' 
    open("#{Rails.root.to_s}/tmp/#{a.attachment_file_name}", "wb") do |file| 
     file << open(a.authenticated_url()).read 
     attachments[a.attachment_file_name] = File.read("#{Rails.root.to_s}/tmp/#{a.attachment_file_name}") 
    end 
    end 
end 

mail(:to => "#{XXXX}", 
     :reply_to => "XXXXX>", 
     :subject => "XXXXXX" 
    ) 

a.authenticated_url() просто дает мне URL для s3, чтобы получить файл (любого типа), Я проверил это, отлично работает. Что-то связанное с тем, как я сохраняю tempfile, должно нарушать приложение ActionMailer.

Любые идеи?

+0

Вы можете подтвердить, что файл tmp, загруженный с S3, в порядке? – ffoeg 2011-01-09 17:48:20

ответ

7

Это может работать лучше, потому что он не касается файловой системы (которая часто проблематична на Heroku):

require 'net/http' 
require 'net/https' # You can remove this if you don't need HTTPS 
require 'uri' 

class UserMailer < ActionMailer::Base 
    # Add Attachments if any 
    if @comment.attachments.count > 0 
    @comment.attachments.each do |a| 
     # Parse the S3 URL into its constituent parts 
     uri = URI.parse a.authenticated_url 
     # Use Ruby's built-in Net::HTTP to read the attachment into memory 
     response = Net::HTTP.start(uri.host, uri.port) { |http| http.get uri.path } 
     # Attach it to your outgoing ActionMailer email 
     attachments[a.attachment_file_name] = response.body 
    end 
    end 
end 

Я не думаю, что это вызовет какие-либо дополнительные вопросы памяти, потому что в любом случае у вас есть для загрузки данных файла в память на линии attachments[a.attachment_file_name].

+0

, который отлично работает ... настройка типа контента отлично подходит для написания строки (результат визуализации шаблона) и прикрепления ее к файлу html для отправки – Avishai 2011-11-06 15:02:05

Смежные вопросы