ActionMailer - Как добавить вложение? - PullRequest
4 голосов
/ 05 декабря 2010

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

Стек приложений: рельсы 3, героку, скрепка + 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, чтобы получить файл (любого типа), я проверил это, работает нормально. Что-то, что связано с тем, как я сохраняю временный файл, должно нарушать вложение ActionMailer.

Есть идеи?

1 Ответ

7 голосов
/ 10 января 2011

Это может работать лучше, потому что не затрагивает файловую систему (что часто проблематично в 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].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...