开发者

ActionMailer - How to add an attachment from s3

Im trying to add attachments to the contact form on this site Im making but I cant get action mailer to attach the uploaded file. I have paperclip uploading the file to S3 but I cant get it to grab the file and attach it to the message.

My app stack is: Heroku, Rails 3, and paperclip uploading to S3, heres what I have so far:

  def contact_notification(sender)
    @sender = sender

    if attachments.count > 0
      # Parse the S3 URL into its constituent parts
        uri = URI.parse @sender.photo.url(:original).authenticated_url
        # Use Ruby's built-in Net::HTTP to read the attachment into memory
        resp开发者_Go百科onse = Net::HTTP.start(uri.host, uri.port) { |http| http.get uri.path }
        # Attach it to your outgoing ActionMailer email
        attachments[@sender.attachment_file_name] = response.body
    end
  mail(:to => xxx)      

end

What am I doing wrong? Im still a rails noob so Im piecing this together.


A quick note:

Amazon now requires

gem 'aws-sdk',   :require => "aws-sdk"  

instead of the s3 gem listed above.


If you don't have an s3 account already go get one here:

http://aws.amazon.com/s3/

You need to add this to your contact model:

app/models/contact.rb

  has_attached_file :picture, 
                     :styles => {:large => "275x450>"},
                     :storage => :s3, 
                     :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
                     :path => "appname/:attachment/:style/:id.:extension"

Make sure you appname is your rails app name on heroku. And make sure you rename picture to whatever you have named your picture.

Then you need a config file in config/s3.yml.

development:
  bucket: bucked_name
  access_key_id: key
  secret_access_key: secret

production:
  bucket: bucked_name
  access_key_id: key
  secret_access_key: secret

Make sure you get the key and secret correct.

In your gem file make sure you have these gems install :

gem "aws-s3", :require => "aws/s3"
gem "paperclip"

Then in your form you need a file field and declare the form a multipart:

<% form_for(@contact, :html => {:multipart => true}) do |f| %>
    <p><%= f.file_field :picture %></p>
<% end %>

And that should do it. If you don't have an s3 account already go get one here:

http://aws.amazon.com/s3/

You need to add this to your contact model:

app/models/contact.rb

  has_attached_file :picture, 
                     :styles => {:large => "275x450>"},
                     :storage => :s3, 
                     :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
                     :path => "appname/:attachment/:style/:id.:extension"

Make sure you appname is your rails app name on heroku. And make sure you rename picture to whatever you have named your picture.

Then you need a config file in config/s3.yml.

development:
  bucket: bucked_name
  access_key_id: key
  secret_access_key: secret

production:
  bucket: bucked_name
  access_key_id: key
  secret_access_key: secret

Make sure you get the key and secret correct.

In your gem file make sure you have these gems install :

gem "aws-s3", :require => "aws/s3"
gem "paperclip"

Then in your form you need a file field and declare the form a multipart:

<% form_for(@contact, :html => {:multipart => true}) do |f| %>
    <p><%= f.file_field :picture %></p>
<% end %>

Then mail your contact with the picture. You said that you were using rails 3?

So in your contact model:

class Contact << ActiveRecord::Base

    before_save :mail_user

    def mailer_user
        ContactMailer.contact_notification(@user).deliver
    end

end

Then in your mailer (assuming you are on Rails 3):

class ContactMailer < ActionMailer::Base

  default :from => "sam@codeglot.com"

  def contact_notification(@user)
    @subscription = "test"
    @url  = "test"
    mail(:to => "test@test.com",
        :subject => "Test")
  end

end

So in your mailer view you need to include and image tag like so:

<%= image_tag(@contact.picture(:small)) %>

Then you just need to send you email after a contact is created and include the attachment.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜