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() 命令解决了它。
我写了一个 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() 命令解决了它。