在Django中,如何将上传到内存中的文件保存为电子邮件附件



我正在为我们的客户构建一个电子邮件网关,需要能够将他们上传的文件附加到电子邮件中。我使用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()

这将导致"未提供异常消息"和调试中的以下值:

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

因此,由于某种原因,似乎没有文件内容。不确定这里发生了什么。文档中的示例将文件保存到模型中,但此处没有可保存文件的模型。理想情况下,我只想将文件内容直接传递给attach方法并发送。关于如何使其工作,有什么想法吗?

看起来我比最初想象的更接近了。下面的人成功了。

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文档中的第二种文件附件方法,而我最初尝试的是第一种方法。

最新更新