如何通过电子邮件将Django FileField作为附件发送?

我需要使用Django将models.FileField作为电子邮件附件发送。 我已经看到了一些片段,展示了如何使用原始request.FILES数据(它仍包含Content-Type)执行此操作,但是一旦您已经保存了该文件,却无法找到任何显示该操作的内容在models.FileField 。 内容类型似乎无法从models.FileField访问。

有人能给我一个这样的例子吗? 我开始认为当我保存文件时,我可能不得不在模型中存储Content-Type。

谢谢!


我只是不提供内容类型,并让收件人的电子邮件客户端解决它。 除非它是不寻常的,否则它不应该是一个问题。

RFC2616指出:

当且仅当媒体类型不是由内容类型字段给出时,接收者可以尝试通过检查媒体类型的内容和/或用于标识资源的URI的名称扩展来猜测媒体类型。

但是 ...如果你想指定它,那么在上传时存储内容类型是一个非常好的主意。 应该指出,django自己的文档说要验证用户的数据

如果你使用* unix操作系统,你可以尝试猜测/检查它:

import subprocess
subprocess.check_output(['file', '-b', '--mime', filename]) 

(从如何在python中查找文件的MIME类型?)


在django中将models.FileField文件附加到电子邮件中非常简单:

from django.core.mail import EmailMultiAlternatives
kwargs = dict(
    to=to,
    from_email=from_addr,
    subject=subject,
    body=text_content,
    alternatives=((html_content, 'text/html'),)
)
message = EmailMultiAlternatives(**kwargs)
message.attach_file(model_instance.filefield.path)
message.send()

另一种方法:

from django.core.mail.message import EmailMessage

msg = EmailMessage(subject=my_subject, body=my_email_body, 
      from_email=settings.DEFAULT_FROM_EMAIL, to=[to_addressed])
msg.attach_file(self.my_filefield.file) # self.my_filefield.path for Django 1.7+
msg.send(fail_silently=not(settings.DEBUG))
链接地址: http://www.djcxy.com/p/46805.html

上一篇: How to Email a Django FileField as an Attachment?

下一篇: Detecting if a file is an image in Python