我需要使用Django发送models.FileField
作为电子邮件附件。我已经看到了使用原始request.FILES
数据(仍然包含Content-Type)显示如何执行此操作的片段,但是一旦您已经保存,就无法找到任何显示如何执行此操作的内容models.FileField
中的文件。 models.FileField
。
有人能给我一个如何运作的例子吗?我开始认为在保存文件时我可能必须将Content-Type存储在模型中。
谢谢!
答案 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])