ActionMailer - 如何添加附件?

5

看起来很简单,但我一直无法使其正常工作。这些文件在Web应用程序中从S3正常工作,但是当我通过以下代码将它们发送到电子邮件时,这些文件会损坏。

应用程序堆栈:rails 3、heroku、paperclip + 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() 只是给我一个访问s3文件的URL(任何类型的文件),我已经检查过了,可以正常工作。可能是我保存临时文件的方法破坏了ActionMailer附件的功能。有什么想法吗?

你能确认从S3下载的临时文件是否正常吗? - ffoeg
1个回答

8
这可能更有效,因为它不会触及文件系统(在Heroku上通常会出现问题):

这种方法可能更好,因为它不会涉及文件系统(在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]行将文件数据加载到内存中。


这很好用...设置内容类型非常适合当您需要将字符串(模板渲染结果)写出并附加为HTML文件以发送时。 - Avishai
我怎样能够发送作为附件的图片,来自另一台服务器的图片并将其作为附件发送到邮件? - SSR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接