2010-10-15 10 views
11

Mon application crée un fichier .pdf lorsqu'il est rendu en passant à l'URL (par exemple, domain.com/letter/2.pdf)Comment attacher un fichier .pdf au format .pdf à un courrier électronique dans Rails 2.3.5?

qu'il ne soit pas sauvé partout.

Comment est-ce que je peux faire ce pdf réel une pièce jointe dans un email sortant.

Voici mon logiciel de messagerie:

def campaign_email(contact,email) 
    subject email.subject 
    recipients contact.email 
    from  'Me <[email protected]>' 
    sent_on Date.today 

    attachment = File.read("http://localhost:3000/contact_letters/#{attachment.id}.pdf") 

    attachment "application/pdf" do |a| 
    a.body = attachment 
    a.filename = "Othersheet.pdf" 
    end 
end 

C'est le contrôleur qui crée/rend le PDF:

def create 
    @contact_letter = ContactLetter.new(params[:contact_letter]) 

    @contact = Contact.find_by_id(@contact_letter.contact_id) 
    @letter = Letter.find_by_id(@contact_letter.letter_id) 

    if @contact_letter.save 
     flash[:notice] = "Successfully created contact letter." 

     #redirect_to contact_path(@contact_letter.contact_id) 
     redirect_to contact_letter_path(@contact_letter, :format => 'pdf') 
    else 
     render :action => 'new' 
    end 
    end 

NOTE: Je Hardcoded localhost: 3000/comment puis-je remplacer que par une variable de sorte que sur dev il est localhost: 3000 et sur la production est-ce le bon domaine? Est-il possible d'inclure le routage dans ce)

ERREUR: Je reçois un

Invalid argument - http://localhost:3000/contact_letters/9.pdf

+0

êtes-vous sur les rails 2 ou 3? – thatmiddleway

+0

rails 2.3.5 (?) – Angela

+0

pouvez-vous également afficher le code de la lettre-contrôleur qui envoie le pdf? – nathanvda

Répondre

0

J'ai eu à travailler en passant l'objet pdf directement dans la méthode campaign_email puis assigner une pièce-jointe.

5

Voici un exemple pour les rails 2

class ApplicationMailer < ActionMailer::Base 
# attachments 
def signup_notification(recipient, letter) 
    recipients  recipient.email_address_with_name 
    subject   "New account information" 
    from   "[email protected]" 

    attachment :content_type => "image/jpeg", 
    :body => File.read("an-image.jpg") 

    attachment "application/pdf" do |a| 
    a.body = letter 
    end 
end 
end 

dans votre vue ou partout où votre appel à votre méthode:

ApplicationMailer.deliver_signup_notification(letter) 
+0

que voulez-vous dire par générer mon pdf là .... serait-ce le chemin? – Angela

+0

cela, ou la méthode que vous utilisez pour créer votre pdf – thatmiddleway

+0

Ceci est le chemin dans la méthode create: contact_letter_path (@contact_letter,: format => 'pdf') est ce que j'ai mis là? – Angela

0

un rapide une solution facile serait récupérer le contenu d'URL à l'aide net/http et open-uri, pour obtenir le joindre ment

attachments['free_book.pdf'] = open("http://#{request.host}/letter/#{id}.pdf") 

par exemple:

def campaign_email(contact,email) 
    subject email.subject 
    recipients contact.email 
    attachments['free_book.pdf'] = open("http://#{request.host}/letter/#{id}.pdf") 
    from  'Me <[email protected]>' 
    sent_on Date.today 

    body  :email => email 
end 

ou, appelez la génération de PDF dans votre action contrôleur mailer

+0

comment puis-je appeler le fichier PDF générer dans l'expéditeur action du contrôleur?Puis-je utiliser – Angela

+0

pièces jointes ['free.pdf'] = ouvrir (contact_letter_path (@contact_letter,: format => 'pdf')) – Angela

+0

les pièces jointes n'est pas une méthode connue pour ActionMailer - c'est l'erreur que je reçois .... – Angela