2010-12-05 8 views
3

Cela semble assez simple, mais je n'ai pas réussi à le faire fonctionner. Les fichiers fonctionnent correctement depuis S3 sur l'application Web, mais lorsque je les envoie par courrier électronique via le code ci-dessous, les fichiers sont corrompus.ActionMailer - Comment ajouter une pièce jointe?

Stack App: 3 rails, Heroku, + s3 paperclip

Voici le code:

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() me donne juste une URL à s3 pour obtenir le fichier (de tout type), J'ai vérifié cela, fonctionne bien. Quelque chose à voir avec la façon dont je sauvegarde le fichier temporaire doit être de briser l'attachement ActionMailer.

Des idées?

+0

pouvez-vous confirmer que le fichier tmp téléchargé à partir de S3 est ok? – ffoeg

Répondre

7

Cela pourrait fonctionner mieux, car il ne touche le système de fichiers (ce qui est souvent problématique sur Heroku) pas:

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 

Je ne pense pas que cela entraînera des problèmes de mémoire supplémentaires, car dans tous les cas que vous avez pour charger les données du fichier en mémoire sur la ligne attachments[a.attachment_file_name].

+0

qui fonctionne bien ... définir le type de contenu fonctionne très bien pour quand vous devez écrire une chaîne (résultat du rendu de modèle) et l'attacher comme un fichier html pour l'envoi – Avishai

+0

comment puis-je envoyer l'image en pièce jointe, image d'un autre serveur et l'envoyer au mail en pièce jointe ??? – SSR