12

models.FileFieldDjangoを使用してメールの添付ファイルとしてを送信する必要があります。生データ(まだContent-Typeが含まれている)でこれを行う方法を示すスニペットを見てrequest.FILESきましたが、ファイルをに保存した後は、それを行う方法を示すものを見つけることができませんでしたmodels.FileField。コンテンツタイプはからアクセスできないようmodels.FileFieldです。

誰かがこれがどのように機能するかの例を教えてもらえますか?ファイルを保存するときに、モデルにContent-Typeを保存する必要があるのではないかと考え始めています。

ありがとう!

4

4 に答える 4

18

Eメールメッセージにmodels.FileFieldファイルを添付することは、Djangoでは素晴らしくシンプルです。

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()
于 2011-11-21T22:23:47.080 に答える
6

別のアプローチ:

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.path) # self.my_filefield.file for Django < 1.7
msg.send(fail_silently=not(settings.DEBUG))
于 2012-06-13T16:33:37.823 に答える
6

私はdjango-storagesを使用しているので、.pathレイズします

NotImplementedError: This backend doesn't support absolute paths.

これを回避するには、ファイルを開いて読み取り、mimetypeを推測して後で閉じますが、魔法.attachの代わりに使用する必要があります。.attach_file

from mimetypes import guess_type
from os.path import basename


f = model.filefield
f.open()
# msg.attach(filename, content, mimetype)
msg.attach(basename(f.name), f.read(), guess_type(f.name)[0])
f.close()
于 2019-01-30T07:42:29.740 に答える
0

コンテンツタイプを提供せず、受信者の電子メールクライアントに処理させます。それが異常なものでない限り、それは問題ではないはずです。

RFC2616は次のように述べています。

メディアタイプがContent-Typeフィールドで指定されていない場合に限り、受信者は、コンテンツやリソースの識別に使用されるURIの名前拡張子を調べてメディアタイプを推測しようとする場合があります。

しかし...それを指定したい場合は、アップロード時にコンテンツタイプを保存することをお勧めします。django自身のドキュメントは、ユーザーからのデータを検証するように言っていることに注意してください

* unix OSを使用している場合は、推測/検査を試みることができます。

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

Pythonでファイルのmimeタイプを見つける方法から?

于 2011-06-28T04:10:02.347 に答える