2017-10-04 3 views
0

Cette question a quelques éléments here, mais pas de réponse finale.Django - Joindre PDF généré par une vue à un e-mail

Il est vue de générer un fichier PDF avec easy_pdf

from easy_pdf.views import PDFTemplateResponseMixin 

class PostPDFDetailView(PDFTemplateResponseMixin,DetailView): 
    model = models.Post 
    template_name = 'post/post_pdf.html' 

Ensuite, je veux joindre ce produit PDF à l'adresse électronique suivante:

@receiver(post_save, sender=Post) 
def first_mail(sender, instance, **kwargs): 
    if kwargs['created']: 
     user_email = instance.client.email 
     subject, from_email, to = 'New account', '[email protected]', user_email 
     post_id = str(instance.id) 
     domain = Site.objects.get_current().domain 
     post_pdf = domain + '/post/' + post_id + '.pdf' 

     text_content = render_to_string('post/mail_post.txt') 
     html_content = render_to_string('post/mail_post.html') 

     # create the email, and attach the HTML version as well. 
     msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) 
     msg.attach_alternative(html_content, "text/html") 
     msg.attach_file(post_pdf, 'application/pdf') 
     msg.send() 

J'ai aussi essayé celui-ci:

msg.attach_file(domain + '/post/' + post_id + '.pdf', 'application/pdf') 

Répondre

0

Je ne sais pas si cela aide, mais j'ai utilisé EmailMessage intégré pour attacher les fichiers PDF que j'ai créés pour rapports aux e-mails que j'ai envoyé:

from django.core.mail import send_mail, EmailMessage 

draft_email = EmailMessage(
      #subject, 
      #body, 
      #from_email, 
      #to_email, 
) 

Option 1:

# attach a file you have saved to the system... expects the path 
draft_email.attach_file(report_pdf.name) 

Option 2:

# expects the name of the file object 
draft_email.attach("Report.pdf") 

Ensuite, envoie comme vous avez déjà:

draft_email.send() 

Certains premières pensées: il semble que vous essayez de utilisez attach_file pour attacher un fichier du système, mais ce n'est pas sur le système. J'essayerais d'employer attach au lieu de attach_file, si je lis votre code correctement, puisque le pdf est dans votre mémoire, pas dans LTS sur le système.

+0

Je pense que le problème vient du fait que le PDF est généré lorsque la vue est demandée, il ne peut donc pas être joint à l'e-mail. Qu'est ce que tu penses de ça? –

+0

Je n'ai pas eu de problème en utilisant le lien lorsque le fichier n'est pas créé ... Cela vaut la peine d'essayer. En supposant que le fichier est toujours ouvert et en cache lorsqu'il essaie de le joindre à l'e-mail. Pouvez-vous partager vos erreurs? – Doug

+0

En utilisant easy_pdf, le fichier PDF n'est pas enregistré quelque part. C'est seulement généré. Donc le fichier report.pdf n'existe pas. –

0

Je cherchais un moyen de joindre un fichier PDF easy_pdf sans enregistrer un fichier temporaire. Depuis que je ne pouvais pas trouver une solution ailleurs, je suggère une proposition courte et de travail en utilisant easy_pdf.rendering.render_to_pdf:

from easy_pdf.rendering import render_to_pdf 
... 
post_pdf = render_to_pdf(
     'post/post_pdf.html', 
     {'any_context_item_to_pass_to_the_template': context_value,}, 
) 
... 
msg.attach('file.pdf', post_pdf, 'application/pdf') 

J'espère que cela vous aidera si vous êtes toujours intéressé par une façon de le faire.