Django рассылает массовые электронные письма

Я работаю над сервисом для отправки массовых писем в django. У меня есть этот метод, который хорошо работает с сельдереем

@shared_task(bind=True)
def send_mails(self,saved_id):
    text = BroadCast.objects.get(id=saved_id)
    attendees = EventAttendee.objects.filter(event__id=text.id)
    message = text.body
    subject = text.subject
    document = text.attachment
    recipient_list=[]
    for attend in attendees:

        text_content = render_to_string(template_text, {'name': attend.client_name, 'message':message})
        html_content = render_to_string(template_html, {'name': attend.client_name,'message':message})

        mail.send(
            [attend.client_email],
            email_from,
             subject=subject,
             html_message=html_content,
             attachments = {str(document):document}
        )

Моя проблема заключается в том, что если у меня, например, 1000 участников, мне придется открыть 1000 соединений, что, я считаю, очень плохо.

Как я могу реструктурировать его, чтобы я открывал только одно соединение и мог отправлять 1000 электронных писем.


person Ombwayo Michael    schedule 08.12.2019    source источник


Ответы (2)


Из документов Django

django.core.mail.send_mass_mail() предназначен для обработки массовой рассылки по электронной почте.

Поскольку вы отправляете html, вам потребуется дополнительный шаг, рассмотрите следующий фрагмент кода из этого ответ стекового потока:

from django.core.mail import get_connection, EmailMultiAlternatives

def send_mass_html_mail(datatuple, fail_silently=False, user=None, password=None, 
                        connection=None):
    """
    Given a datatuple of (subject, text_content, html_content, from_email,
    recipient_list), sends each message to each recipient list. Returns the
    number of emails sent.

    If from_email is None, the DEFAULT_FROM_EMAIL setting is used.
    If auth_user and auth_password are set, they're used to log in.
    If auth_user is None, the EMAIL_HOST_USER setting is used.
    If auth_password is None, the EMAIL_HOST_PASSWORD setting is used.

    """
    connection = connection or get_connection(
        username=user, password=password, fail_silently=fail_silently)
    messages = []
    for subject, text, html, from_email, recipient in datatuple:
        message = EmailMultiAlternatives(subject, text, from_email, recipient)
        message.attach_alternative(html, 'text/html')
        messages.append(message)
    return connection.send_messages(messages)
person Nader Alexan    schedule 08.12.2019

Тогда вы, вероятно, захотите использовать send_mass_mail

будет открыто только одно соединение с почтовым сервером

Поэтому создайте кортеж сообщений для всех писем, которые вы хотите отправить. (Связанная официальная документация хорошо объясняет использование)

person heyhugo    schedule 08.12.2019