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 回答