I a Rails app that handles Customer Tickets (worequests). The Tickets have Comments back and forth between the Customer and an Employee. The Comment can have an attachment. It's running on Heroku and PaperClip is storing the attachments in S3.

When a new Comment is created and email is sent to both the Customer and the Employee assigned to the Ticket.

I'm using CloudMailIn so that the Customer or Employee can respond to a Comment email with a new Comment.

So far that works fine!

But, I would like to allow the returning email to contain a single attachment.

This is the working incoming mails controller:

class IncomingMailsController < ApplicationController
  skip_before_filter :verify_authenticity_token

  def create
    Rails.logger.info params
    worequest = params[:envelope][:to].split('@')[0]
    contents = params[:plain].split('---')[0]
    message = Comment.new(
        :worequest_id  => worequest,
        :user_id => User.find_by_email(params[:envelope][:from]).id,
        :comments => contents,
        :tenant_id => 1
    )
    if message.save
      render :text => 'Success', :status => 200
    else
      render :text => message.errors.full_messages, :status => 422, :content_type => Mime::TEXT.to_s
    end
end

The log results for Rails.logger.info params includes this:

"envelope"=>{"to"=>"60@mail.myapp.com", "recipients"=>{"0"=>"60@mail.myapp.com"}, "from"=>"someguy@gmail.com", "helo_domain"=>"mail-wi0-f175.google.com", "remote_ip"=>"xxx.xx.xxx.xxx", "spf"=>{"result"=>"temp_error", "domain"=>"mydomain.com"}}, 

"attachments"=>{"0"=>#<ActionDispatch::Http::UploadedFile:0x00000007194040 @original_filename="five guys.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"attachments[0]\"; filename=\"five guys.jpeg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<File:/tmp/RackMultipart20140115-5-1n2rb24>>}, "action"=>"create", "controller"=>"incoming_mails"} 

attachments is a hash and “0” is the name of the key. params[:attachments][‘0’]

I can access these fields fine:

Rails.logger.info params[:envelope][:from]
Rails.logger.info params[:envelope][:to]
Rails.logger.info params[:attachments]['0'].original_filename
Rails.logger.info params[:attachments]['0'].content_type

But, how do I set the PaperClip :attach file?

:attach => params[:attachments]['0'].tempfile  ?
:attach => params[:attachments]['0'].read  ?

This is my current attempt:

attach = Attachment.new(
    :comment_id  => 346,
    :name => "Email Attachment",
    :attach_file_name => params[:attachments]['0'].original_filename,
    :attach_content_type =>  params[:attachments]['0'].content_type,
    :attach => params[:attachments]['0'].path,
    :tenant_id => 1
)

The :attach => params[:attachments]['0'].path, is wrong.

Getting this:

  Paperclip::AdapterRegistry::NoHandlerError (No handler found for "/tmp/RackMultipart20140115-13-tcpvtw"): 

I don't know what to use ?????

:attach => params[:attachments]['0'].read,
:attach => params[:attachments]['0'].path.to_file,
:attach => params[:attachments]['0'].path.read,

Thanks for the help!

有帮助吗?

解决方案

This worked:

        :attach => params[:attachments]['0'],
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top