2010-12-05 10 views
3

シンプルですが、私はそれを動作させることができませんでした。ファイルはWebアプリケーションのS3からうまく動作しますが、以下のコードでメールを送信するとファイルが破損しています。ActionMailer - 添付ファイルを追加するには?

アプリケーションスタック:レール3、Herokuの、クリップ+ 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添付ファイルを破る必要があります。

アイデア?

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 

私は、これは余分なメモリの問題を引き起こすことはないと思うので、あなたが持っているどのような場合には:それは(Herokuの上でしばしば問題である)ファイルシステムには触れていないので、これは良い仕事かもしれない

+0

S3からダウンロードしたtmpファイルが正常であることを確認できますか? – ffoeg

答えて

7

ファイルのデータをattachments[a.attachment_file_name]行のメモリにロードします。

+0

素晴らしい作品...コンテンツタイプを設定すると、文字列(テンプレートレンダリングの結果)を書き込んで、送信用のhtmlファイルとして添付する必要があるときに効果的です – Avishai

+0

添付ファイルとして画像を送信するにはどうすればいいですか?添付ファイルとしてメールに送信しますか? – SSR

関連する問題