我想向参加会议的会员(即客人)发送电子邮件,每个人都有(相同的)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'))
会解决我的问题吗?
答案 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。