2017-09-14 1 views
1

J'utilise actuellement python_docx pour créer des documents Word en Python. Ce que j'essaie de réaliser, c'est que j'ai besoin de créer un fichier de document dans Django et ensuite le joindre à un courriel en utilisant django.core.mail sans avoir à sauvegarder le fichier sur le serveur. Je l'ai essayé de créer le fichier Word à l'aide de cette (prise d'une réponse aussi à StackOverflow):Créez un document Word, puis joignez-le au courriel Django

def generate(self, title, content): 
    document = Document() 
    docx_title=title 
    document.add_paragraph(content) 

    f = BytesIO() 
    document.save(f) 
    length = f.tell() 
    f.seek(0) 
    response = HttpResponse(
     f.getvalue(), 
     content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document' 
    ) 
    response['Content-Disposition'] = 'attachment; filename=' + docx_title 
    response['Content-Length'] = length 
    return response 

Et voici où j'expérimenté et essayé de joindre la réponse à l'e-mail:

def sendmail(self, name,email,description,location): 
    message = EmailMessage('Custom Mail', 'Name: '+str(name)+'\nEmail: '+str(email)+'\nDescription: '+str(description)+'\nLocation: '+str(location), '[email protected]',to=['[email protected]']) 
    docattachment = generate('Test','CONTENT') 
    message.attach(docattachment.name,docattachment.read(),docattachment.content_type) 
    message.send() 

Est-ce que j'essaie de réaliser même possible?

EDIT: Je le code de basé message.attach() à partir des paramètres de la joindre() dans django.core.mail

+0

Bien sûr que c'est possible. Cependant, je ne vois pas le besoin de créer un objet 'HTTPResponse'. Avez-vous des erreurs avec ça? –

+0

Oui. Beaucoup, y a-t-il une manière plus courte ou différente de faire ceci? – Jessie

+0

Comment puis-je le faire? – Jessie

Répondre

1

Le problème est dans ce code:

def sendmail(self, name,email,description,location): 
    message = EmailMessage('Custom Mail', 'Name: '+str(name)+'\nEmail: '+str(email)+'\nDescription: '+str(description)+'\nLocation: '+str(location), '[email protected]',to=['[email protected]']) 
    docattachment = generate('Test','CONTENT') 
    message.attach(docattachment.name,docattachment.read(),docattachment.content_type) 
    message.send() 

Dans cette ligne:

message.attach(docattachment.name,docattachment.read(),docattachment.content_type) 

docattachment est la réponse a obtenu de générer() fucn tion et docattachment n'a pas attribut nommé: nom ou lu()

Vous devez remplacer le code ci-dessus avec ceci:

message.attach("Test.doc",docattachment,'application/vnd.openxmlformats-officedocument.wordprocessingml.document') 

Et la constitution du dossier, il ne doit pas être HttpResponse et utilisez à la place BytesIO pour remettre le fichier.

+0

Eh bien, ce n'était pas exactement ta réponse qui l'a fait fonctionner, mais ça m'a aidé à comprendre comment. Merci. – Jessie

+0

Je suis honnêtement à une perte si je devrais, car il y a d'autres facteurs pour lesquels votre réponse ne fonctionnerait pas car vous devriez avoir souligné le fait qu'il ne devrait pas être une HttpResponse et à la place utiliser BytesIO. Je lui donne un upvote mais si vous le modifiez, oui. Je vais l'accepter :) – Jessie