Отправлять массовые письма в Django с тем же вложением - PullRequest
3 голосов
/ 09 мая 2011

Я хочу отправлять электронные письма участникам моего сайта, которые должны присутствовать на собрании (например, гости), каждое с (одинаковым) вложением в формате 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-файлы.Если размер файла составляет 10 МБ, эти 10 МБ будут загружены на мой почтовый сервер для каждого гостя, где это могло быть только один раз.

Итак, вопрос : можно ли прикрепить файл ко всем электронным письмам одновременно, тем самым загрузив его только один раз?Или я просто делаю это неправильно?

ОБНОВЛЕНИЕ :

Если я изменю строку подключения следующим образом:

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

будет ли эторешить мою проблему?

1 Ответ

0 голосов
/ 09 мая 2011

Глядя на 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...