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

时间:2011-06-28 01:23:55

标签: django email-attachments filefield

我需要使用Django发送models.FileField作为电子邮件附件。我已经看到了使用原始request.FILES数据(仍然包含Content-Type)显示如何执行此操作的片段,但是一旦您已经保存,就无法找到任何显示如何执行此操作的内容models.FileField中的文件。 models.FileField

似乎无法访问内容类型

有人能给我一个如何运作的例子吗?我开始认为在保存文件时我可能必须将Content-Type存储在模型中。

谢谢!

4 个答案:

答案 0 :(得分:14)

在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()

答案 1 :(得分:4)

另一种方法:

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))

答案 2 :(得分:1)

我正在使用django-storages,所以101st 102 加注了

.path

为避免这种情况,我只需要打开文件,读取文件,猜测mimetype并稍后将其关闭,但是必须使用NotImplementedError: This backend doesn't support absolute paths. 而不是.attach魔术。

.attach_file

答案 3 :(得分:0)

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

RFC2616州:

  

当且仅当媒体类型不是   由Content-Type字段给出,   收件人可能会尝试猜测   媒体类型通过检查它   内容和/或名称扩展名   用于标识的URI   资源。

<强>但 ... 如果你想指定它,那么在上传时存储内容类型是一个非常好的主意。应该注意的是,django自己的文档对verify the data from users

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

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

(来自How to find the mime type of a file in python?