首页 文章

无法通过Paperclip将存储在S3上的文件添加为ActionMailer中的附件

提问于
浏览
9

我正在使用Paperclip和S3在Rails 3应用程序中上传和存储文件 . 上传文件效果很好,但是当我尝试使用actionmailer将上传的文件附加到电子邮件时,我遇到了问题 . 经过大量的故障排除后,希望有人可以提供一些提示 .

从高层来看,似乎我可能需要首先下载文件,在附加之前使用某种下载方法,这是建议在这里,但我不完全遵循如何实现 - paperclip + ActionMailer - Adding an attachment?

在应用程序中,在用户上传文件(在本例中为测验)后,应通过电子邮件通知管理员用户上传的文件 . 我一直在遇到“没有这样的文件或目录” . 以下是我正在使用的代码 . 任何想法或建议将不胜感激!

Quiz.rb model - what users are uploading:

class Quiz < ActiveRecord::Base
attr_accessible :quiz_path, :user_id, :tutorial_id

validates_presence_of :quiz_path
validates_attachment_size :quiz_path, :less_than => 50.kilobytes    
validates_attachment_presence :quiz_path 
validates_attachment_content_type :quiz_path, 
  :content_type => ["application/pdf","application/vnd.ms-excel",     
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
  :message => 'We only accept Microsoft Excel files ending in .xlsx or .xls'

belongs_to :user
belongs_to :tutorial
has_attached_file :quiz_path,
:storage => :s3,
:s3_permissions => :private,
:path => "quizzes/:attachment/:style/:id.:extension",
:storage => :s3,
:s3_credentials => {
  :access_key_id => ENV["AWS_ACCESS_KEY_ID"],
  :bucket => ENV["S3_BUCKET_NAME"],
  :secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"]
}

end

AdminMailer类:

class AdminMailer < ActionMailer::Base

  default from: "info@mydomain.com"

  def admin_upload_notification_email(quiz, current_user)
  @url  = "http://mydomain.com"
  @quiz = quiz
  @user = current_user
  mail(to: "me@mydomain.com", :subject => "New Upload From #{@user.email}")
  attachments["#{quiz.quiz_path_file_name}"] = File.read("{quiz.quiz_path.expiring_url(60)}")
  end
 end

还添加了QuizzesController:

def create
 @user = current_user
 @quiz = @user.quizzes.create(params[:quiz])

 respond_to do |format|
  if @quiz.save
    UserMailer.upload_notification_email(@user).deliver
    AdminMailer.admin_upload_notification_email(@quiz, @user).deliver

    format.html { redirect_to @user, notice: 'Your skill assessment answer file was successfully uploaded.  We will review your responses and email you a link to your results as soon as possible.' }
    format.json { render json: @user, status: :created, location: @quiz }
  elsif @quiz.errors.any?
    flash[:error] = 'Please make sure you selected your answer file and it ended in ".xlsx".'
    return(redirect_to :back)
  else  
    format.html { redirect_to @user, notice: 'No file was selected.  Please back and choose "Select Your Answer File" before submitting.' }
    format.json { render json: @quiz.errors, status: :unprocessable_entity }
  end
 end
end

2 回答

  • 20

    在弄乱了一些之后,能够让它运转起来 . 以下是对我有用的 - 希望它可以帮助某人 . 关键是使用open uri,因为测验文件在S3上 .

    class AdminMailer < ActionMailer::Base
    
    require 'open-uri'
    
    default from: "sales@mydomain.com"
    
    def admin_upload_notification_email(quiz, current_user)
      @url  = "http://mydomain.com"
      @quiz = quiz
      @user = current_user
      attachments["#{quiz.quiz_path_file_name}"] = open("#{quiz.quiz_path.expiring_url(60)}").read
    
      mail(to: "admin@mydomain.com", :subject => "New Upload From #{@user.email}")
    end
    
    
    end
    
  • 0

    就我而言,问题是在 mail() 调用中指定 content_type: "text/html" . 删除它修复了我在Rails 4上的问题 .

    require 'open-uri' # Allows us to read the S3 content into the mail attachment.
    
    class InvoiceMailer < ActionMailer::Base
      def send_invoice(user, invoice)
        @user = user
        @invoice = invoice
        attachments["invoice.pdf"] = open(@invoice.s3_url).read
        mail(to: @user.email, subject: "This Month's Invoice")
      end
    end
    

    这样可以在Outlook和Gmail上正确呈现PDF文档附件,但应该可以在任何地方使用 .

相关问题