在Django中,如何将已上传到内存中的文件保存为邮件附件?
In Django, how do I save a file that has been uploaded in memory as an email attachment?
我正在为我们的客户构建一个电子邮件网关,需要能够将他们上传的文件附加到电子邮件中。我正在使用 EmailMultiAlternatives
发送电子邮件,并使用 FileField
进行上传。当我尝试连接两者时出现问题。在我看来有以下逻辑。
if request.method == 'POST':
form = MyForm(request.POST, request.FILES)
if form.is_valid():
...
email = EmailMultiAlternatives(...)
email.attach(request.FILES['image'])
else:
form = MyForm()
这导致 "No exception message supplied" 和调试中的以下值:
content: None
filename: <InMemoryUploadedFile: ImageFile.png (image/png)>
mimetype: None
所以看起来由于某种原因,没有文件内容。不确定这里发生了什么。文档中的示例将文件保存到模型,但没有模型将文件保存到此处。理想情况下,我只想将文件内容直接传递给附加方法并继续发送。关于如何使这项工作有任何想法吗?
看起来我比我原先想象的要近。以下方法成功了。
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()
这利用了 Django 文档中的 second method of file attachment,而我最初尝试的是第一个。
我正在为我们的客户构建一个电子邮件网关,需要能够将他们上传的文件附加到电子邮件中。我正在使用 EmailMultiAlternatives
发送电子邮件,并使用 FileField
进行上传。当我尝试连接两者时出现问题。在我看来有以下逻辑。
if request.method == 'POST':
form = MyForm(request.POST, request.FILES)
if form.is_valid():
...
email = EmailMultiAlternatives(...)
email.attach(request.FILES['image'])
else:
form = MyForm()
这导致 "No exception message supplied" 和调试中的以下值:
content: None
filename: <InMemoryUploadedFile: ImageFile.png (image/png)>
mimetype: None
所以看起来由于某种原因,没有文件内容。不确定这里发生了什么。文档中的示例将文件保存到模型,但没有模型将文件保存到此处。理想情况下,我只想将文件内容直接传递给附加方法并继续发送。关于如何使这项工作有任何想法吗?
看起来我比我原先想象的要近。以下方法成功了。
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()
这利用了 Django 文档中的 second method of file attachment,而我最初尝试的是第一个。