Как отправить электронное письмо 10 000 пользователей в Django?

У моего приложения Django 10 000 пользователей, у всех есть электронные письма. Я хотел бы отправить сообщение по электронной почте всем из них, скажем, раз в месяц. Это сообщение может иметь несколько вложений в формате pdf.

Что я пробовал, так это использовать объект EmailMessage, чтобы отправить электронное письмо всем им. Я добавляю адреса электронной почты всех пользователей в компонент скрытой копии этого сообщения электронной почты перед отправкой.

        recList = []
        for recipient in rec:
            reci = str.strip(str(recipient))
            recList.append(reci)
            message = (form.cleaned_data['subject'], form.cleaned_data['message'], '[email protected]', recList)
        mail = EmailMessage(form.cleaned_data['subject'], form.cleaned_data['message'], '[email protected]', ['[email protected]'], recList)
        num_attachments = 0
        if form.cleaned_data['attachment'] != None:
            email_attachment = EmailAttachment(
                document_name = form.cleaned_data['attachment'].name,
                email_message = email,
                document = form.cleaned_data['attachment'],
            )
            email_attachment.save()
            mail.attach_file(settings.MEDIA_ROOT + "/" + email_attachment.document.name)
        mail.send(fail_silently=False)

Однако, когда я отправляю электронное письмо, Django жалуется, что «соединение было сброшено», и не отправляет. Я предполагаю, что соединение с сервером было закрыто.

Какой эффективный способ отправить массовую рассылку по электронной почте в Django? Будет ли send_mass_mail() более эффективным?


person dangerChihuahua007    schedule 28.12.2011    source источник
comment
Обратите внимание, что вы забыли проверить флаг Receiver.hasSignedUpForEmail. Кроме того, менее забавно, почему вы создаете «сообщение» и почему оно находится внутри цикла, каждый раз перезаписываясь?   -  person Spacedman    schedule 28.12.2011
comment
пробовали ли вы через code.google.com/p/django-mailer   -  person Ahsan    schedule 29.12.2011


Ответы (3)


Альтернативное предложение: зарегистрируйтесь в почтовой службе и используйте их API для ведения списка адресов электронной почты и отправки рассылок. Пара преимуществ такого подхода:

  • Они будут обрабатывать любые запросы на отмену подписки за вас, поэтому вам не нужно беспокоиться о добавлении флагов исключения для ваших пользователей, которым не нужны ваши электронные письма.
  • Вы с меньшей вероятностью будете отфильтрованы спамом из почтовых ящиков ваших пользователей или будете раздражать своего хостинг-провайдера.

Существуют оболочки API, доступные, в частности, для MailChimp и Монитор кампании. Должно быть довольно легко добавить хуки для добавления новых пользователей в список рассылки и (если необходимо) удалить всех пользователей, которые удаляют свои учетные записи.

person dhwthompson    schedule 28.12.2011

Вы должны использовать send_mass_mail, так как он не будет закрывать соединение каждый раз. документы

Я бы также разделил сообщения на группы по 100-1000, в зависимости от того, насколько мощный у вас сервер. Причина в том, что вы можете отловить ошибки в меньших группах для повторной попытки. Это также приводит к отдельному электронному письму для каждого получателя, что идеально. BCC'ing тысячи людей не здорово.

person Jordan    schedule 28.12.2011

Я думаю, что заголовок E-mail BCC не может содержать 10000 записей.

person ssbb    schedule 28.12.2011
comment
Это верно. Это зависит от службы электронной почты, но, например, Amazon SES допускает не более 50 получателей в BCC. - person Rob; 27.09.2018