ActionMailer – Como adicionar um anexo?

Parece bastante simples, mas não consegui fazê-lo funcionar. Os arquivos funcionam bem no S3 no aplicativo da web, mas quando eu os envio por e-mail pelo código abaixo, os arquivos estão corrompidos.

App Stack: rails 3, heroku, clipe de papel + s3

Aqui está o código:

class UserMailer  0 @comment.attachments.each do |a| require 'open-uri' open("#{Rails.root.to_s}/tmp/#{a.attachment_file_name}", "wb") do |file| file < "#{XXXX}", :reply_to => "XXXXX>", :subject => "XXXXXX" ) 

a.authenticated_url () só me dá uma URL para s3 para pegar o arquivo (de qualquer tipo), chequei isso, funciona bem. Algo a ver com a maneira como estou salvando o tempfile deve estar quebrando o Attachment do ActionMailer.

Alguma ideia?

Isso pode funcionar melhor porque não toca no sistema de arquivos (o que geralmente é problemático no 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 

Eu não acho que isso causará qualquer problema de memory extra, porque em qualquer caso você tem que carregar os dados do arquivo na memory na linha de attachments[a.attachment_file_name] .