Django post-office:无法打开电子邮件附件

Django post-office: unable to open email attachement

我写了一个 django 视图,它加载了一些 PDF 文件并将它们组合成一个 .zip 文件。

我不想在服务器上保存对象,所以我使用 StringIO()

这是通过以下代码完成的:

zip_buffer = StringIO.StringIO()
        summary_filename = 'summary' + str(user) + '.pdf'
        with zipfile.ZipFile(zip_buffer, mode='w', compression=zipfile.ZIP_DEFLATED) as zf:
            for file in attachements:

                    zf.write(str(settings.MEDIA_ROOT) + '/' + str(file[0].file),
                             file[1] + '.' + str(file[0].file).split('.')[-1])

            zf.writestr(summary_filename, pdf)

当我调试代码时,我通过以下代码return将对象作为浏览器中的下载

response = HttpResponse(zip_buffer.getvalue(), 'application/x-zip-compressed')
    return response

这一切都按预期工作,当我单击按钮时,浏览器会下载一个包含所有信息的 .zip 文件。

当我也想通过电子邮件发送文件时,问题就出现了。我正在使用 Django post-office

并且最初尝试使用以下命令发送电子邮件:

attachment_file = zip_buffer.getvalue()

send_email([requester.email], email_template
               context, attachments={'summary.pdf': attachment_file})

附件文件与我提供给浏览器的文件完全一样,但是这会导致以下异常:

file() argument 1 must be encoded string without NULL bytes, not str

然后我尝试了一些不同的东西:

send_email([requester.email], 'userprofile_summary', requester.profile.tenant,
                   context, attachments={
                'summary.zip': ContentFile(attachment_file)})

现在这在发送电子邮件时带有附件的意义上是有效的,但我收到的文件是无法打开的。就像它的损坏一样,OSX、Windows 和 Linux 计算机都无法打开该文件。

我目前不知道该怎么做/出了什么问题。该文件在浏览器中运行良好,但当我尝试通过电子邮件发送时它崩溃了。当我把它封装成一个'ContentFile()' class时,它return是一个无法打开的文件。

有谁知道我做错了什么吗?

我解决了,是我的代码出错了。对于未来有类似问题的读者:

我忘了在 zf.writestr(summary_filename, pdf) 之后添加 zf.close() ,虽然浏览器能够处理这个错误,但 Django 更加小心 - 导致我的问题。添加 close() 命令解决了它。