ActionMailer - Как добавить вложение из s3 - PullRequest
7 голосов
/ 18 апреля 2011

Я пытаюсь добавить вложения в контактную форму на этом сайте, который я создаю, но я не могу заставить действия отправлять прикрепленный файл.У меня есть скрепка, загружающая файл на S3, но я не могу заставить его взять файл и прикрепить его к сообщению.

Мой стек приложений: Heroku, Rails 3 и загрузка скрепок на S3, вот что у меня есть:

  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
        response = 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

Что я делаю не так?Я все еще рельсовый нуб, так что я собираю это вместе.

Ответы [ 2 ]

1 голос
/ 13 июля 2012

Краткое примечание:

Амазонке теперь требуется

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

вместо камня s3, указанного выше.

0 голосов
/ 14 июля 2011

Если у вас еще нет учетной записи s3, перейдите по ссылке:

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

Вы должны добавить это к вашей модели контакта:

приложение / модели / contact.rb

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

Убедитесь, что ваше имя приложения - это имя вашего приложения rails на heroku. И убедитесь, что вы переименовываете изображение в любое имя, которое вы назвали.

Тогда вам нужен файл конфигурации в 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

Убедитесь, что вы правильно знаете ключ и секрет.

В вашем файле gem убедитесь, что у вас установлены следующие камни:

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

Затем в вашей форме вам нужно поле для файла и объявить форму, состоящую из нескольких частей:

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

И это должно сделать это. Если у вас еще нет учетной записи s3, перейдите по ссылке:

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

Вы должны добавить это к своей модели контакта:

приложение / модели / contact.rb

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

Удостоверьтесь, что ваше appname - это имя вашего рельса на heroku. И убедитесь, что вы переименовываете изображение в любое имя, которое вы назвали.

Тогда вам нужен файл конфигурации в 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

Убедитесь, что вы получили правильный ключ и секрет.

В вашем файле gem убедитесь, что у вас установлены следующие камни:

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

Затем в вашей форме вам нужно поле для файла и объявить форму, состоящую из нескольких частей:

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

Затем отправьте контакт по почте с изображением. Вы сказали, что используете рельсы 3?

Так в вашей контактной модели:

class Contact << ActiveRecord::Base

    before_save :mail_user

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

end

Затем в вашем почтовике (при условии, что вы находитесь на 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

Так что в вашем почтовом представлении вам нужно включить и изображение тега так:

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

Тогда вам просто нужно отправить письмо по электронной почте после создания контакта и добавить вложение.

...