3

ミーティングに参加する予定のサイトのメンバー (つまり、ゲスト) に、それぞれ (同じ) PDF が添付されたメールを送信したいと考えています。これは、Django に組み込まれている一括メール機能を使用して行っていますconnection.send_messages(messages)。現時点では、私はこれをやっています:

guests = Guest.objects.all()
connection = mail.get_connection()
connection.open()
messages = []
for guest in guests:
    msg = EmailMultiAlternatives(title, text_content, from_address, [guest.email], connection=connection)
    msg.attach_alternative(html_content, 'text/html')
    pdf_data = open(os.path.join(settings.MEDIA_ROOT, 'uploads/flyer.pdf'))
    msg.attach('Invitation Card.pdf', pdf_data.read(), 'application/pdf')
    pdf_data.close()
    messages.append(msg)
connection.send_messages(messages)
connection.close()

今、私がこのようにすると、同じ PDF ファイルがすべての電子メールに読み込まれ、個別に添付され、あたかも別の PDF であるかのように、電子メールごとに個別に送信されます。ファイルが 10MB の場合、その 10MB は、ゲストごとに私のメール サーバーにアップロードされます。

問題は、一度にすべての電子メールにファイルを添付して、一度だけアップロードすることは可能ですか? それとも、私はそれを間違っているだけですか?

更新

添付行を次のように変更すると:

msg.attach_file(os.path.join(settings.MEDIA_ROOT, 'uploads/flyer.pdf'))

それは私の問題を解決しますか?

4

1 に答える 1

0

django/core/mail/message.py を見ると、attach_fileを呼び出す前にファイルを開く便利な関数にすぎないことがわかりattachます。

def attach_file(self, path, mimetype=None):
    """Attaches a file from the filesystem."""
    filename = os.path.basename(path)
    content = open(path, 'rb').read()
    self.attach(filename, content, mimetype)

EmailMultiAlternativesメソッドをサブクラス化してオーバーライドすると、添付ファイルを開いてメモリに何度も読み込むことを避けることができますattachこれにはceleryのようなジョブ/タスク キューの使用を検討する必要があります。

于 2011-05-08T21:20:22.983 に答える