使用相同的附件在Django中发送批量电子邮件

时间:2011-05-08 21:00:04

标签: python django email bulk-email

我想向参加会议的会员(即客人)发送电子邮件,每个人都有(相同的)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,则每个单独的guest虚拟机将上传到我的邮件服务器,这可能只有一次。

所以问题是:是否可以一次将文件附加到所有电子邮件,从而也只上传一次?或者我只是做错了吗?

更新

如果我将附加行更改为以下内容:

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

会解决我的问题吗?

1 个答案:

答案 0 :(得分: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