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

mee*_*son 3 django file-upload email-attachments

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

这会导致“未提供异常消息”以及调试中的以下值:

content: None
filename: <InMemoryUploadedFile: ImageFile.png (image/png)>
mimetype: None
Run Code Online (Sandbox Code Playgroud)

所以看起来由于某种原因,没有文件内容。不知道这里发生了什么。文档中的示例将文件保存到模型,但没有模型可以将文件保存到此处。理想情况下,我只想将文件内容直接传递给附加方法并将其发送。关于如何实现这项工作有什么想法吗?

mee*_*son 5

看来我比我原来想象的更近了。下面的方法就成功了。

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()
Run Code Online (Sandbox Code Playgroud)

这利用了Django 文档中的第二种文件附件方法,而我最初尝试的是第一种方法。