In Django, how do I save a file that has been uploaded in memory as an email attachment?

折月煮酒 提交于 2021-01-27 23:41:45

问题


I am building an email gateway for our clients and need to be able to attach the files they upload to the email. I am using EmailMultiAlternatives to send the email and a FileField for the upload. The problem happens when I try to connect the two. I have the following logic in my view.

if request.method == 'POST':
    form = MyForm(request.POST, request.FILES)
    if form.is_valid():
        ...
        email = EmailMultiAlternatives(...)
        email.attach(request.FILES['image'])
else:
    form = MyForm()

This results in "No exception message supplied" and the following values in debug:

content: None
filename: <InMemoryUploadedFile: ImageFile.png (image/png)>
mimetype: None

So it looks like for some reason, there is no file content. Not sure what's going on here. Examples in the docs save the file to a model, but there is no model to save the file to here. Ideally, I would just like to pass the file content directly to the attach method and send it on. Any ideas on how to make this work?


回答1:


Looks like I was closer than I originally thought. The following did the trick.

import mimetypes
from django.core.mail import EmailMultiAlternatives

if request.method == 'POST':
    form = MyForm(request.POST, request.FILES)
    if form.is_valid():
        ...
        file = request.FILES['image']
        email = EmailMultiAlternatives(...)
        email.attach(file.name, file.file.getvalue(), mimetypes.guess_type(file.name)[0])
else:
    form = MyForm()

This makes use of the second method of file attachment in the Django docs, whereas I was originally attempting the first.



来源:https://stackoverflow.com/questions/47205196/in-django-how-do-i-save-a-file-that-has-been-uploaded-in-memory-as-an-email-att

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!