send_mass_emails с EmailMultiAl Альтернативы - PullRequest
18 голосов
/ 28 сентября 2011

Я пытаюсь создать приложение для рассылки новостей и хочу отправить 50 писем с одним подключением. send_mass_mail () выглядит идеально, но я не могу понять, как я называю это в сочетании с EmailMultiAlternatives.

Это мой код, который отправляет только одно письмо с одним подключением:

html_content = render_to_string('newsletter.html', {'newsletter': n,})               
text_content = "..."                      
msg = EmailMultiAlternatives("subject", text_content, "from@bla", ["to@bla"])                                      
msg.attach_alternative(html_content, "text/html")                                                                                                                                                                               
msg.send()  

рабочий пример с кодом выше и send_mass_mail был бы великолепен, спасибо!

Ответы [ 5 ]

31 голосов
/ 18 апреля 2012

То есть send_mass_mail() переписано для использования EmailMultiAlternatives:

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)
15 голосов
/ 28 сентября 2011

Невозможно напрямую использовать send_mass_mail () с EmailMultiAlternatives. Однако, согласно документации Django , send_mass_mail () - это просто оболочка, использующая класс EmailMessage . EmailMultiAlternatives является подклассом EmailMessage. EmailMessage имеет параметр 'connection', позволяющий вам указать одно соединение, которое будет использоваться при отправке сообщения всем получателям, то есть те же функции, которые предоставляет send_mass_mail (). Вы можете использовать функцию get_connection () для получения SMTP-соединения, как определено в настройках SMTP в settings.py.

Я считаю, что следующий (непроверенный) код должен работать:

from django.core.mail import get_connection, EmailMultiAlternatives

connection = get_connection() # uses SMTP server specified in settings.py
connection.open() # If you don't open the connection manually, Django will automatically open, then tear down the connection in msg.send()

html_content = render_to_string('newsletter.html', {'newsletter': n,})               
text_content = "..."                      
msg = EmailMultiAlternatives("subject", text_content, "from@bla", ["to@bla", "to2@bla", "to3@bla"], connection=connection)                                      
msg.attach_alternative(html_content, "text/html")                                                                                                                                                                               
msg.send() 

connection.close() # Cleanup
2 голосов
/ 05 ноября 2015

Вот как я делаю задачу (проверенный код):

from html2text import html2text

from django.utils.translation import ugettext as _
from django.core.mail import EmailMultiAlternatives, get_connection


def create_message(subject, message_plain, message_html, email_from, email_to,
                   custom_headers=None, attachments=None):
    """Build a multipart message containing a multipart alternative for text (plain, HTML) plus
    all the attached files.
    """
    if not message_plain and not message_html:
        raise ValueError(_('Either message_plain or message_html should be not None'))

    if not message_plain:
        message_plain = html2text(message_html)

    return {'subject': subject, 'body': message_plain, 'from_email': email_from, 'to': email_to,
            'attachments': attachments or (), 'headers': custom_headers or {}}


def send_mass_html_mail(datatuple):
    """send mass EmailMultiAlternatives emails
    see: /7701197/sendmassemails-s-emailmultial-alternativy
    datatuple = ((subject, msg_plain, msg_html, email_from, email_to, custom_headers, attachments),)
    """
    connection = get_connection()
    messages = []
    for subject, message_plain, message_html, email_from, email_to, custom_headers, attachments in datatuple:
        msg = EmailMultiAlternatives(
            **create_message(subject, message_plain, message_html, email_from, email_to, custom_headers, attachments))
        if message_html:
            msg.attach_alternative(message_html, 'text/html')
        messages.append(msg)

    return connection.send_messages(messages)
2 голосов
/ 14 августа 2014

Я придерживался смешанного подхода: отправлял пользователям как текстовые, так и html-сообщения и персонализировал сообщения для каждого пользователя.

Я начал с раздела Отправка нескольких электронных писем Документация Django.

from django.conf import settings
from django.contrib.auth.models import User
from django.core import mail
from django.core.mail.message import EmailMultiAlternatives
from django.template.loader import get_template
from django.template import Context

...

connection = mail.get_connection()
connection.open()
messages = list()

for u in users:
    c = Context({ 'first_name': u.first_name, 'reseller': self,})
    subject, from_email, to = 'new reseller', settings.SERVER_EMAIL, u.email
    text_content = plaintext.render(c)
    html_content = htmly.render(c)
    msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
    msg.attach_alternative(html_content, "text/html")
    messages.append(msg)

connection.send_messages(messages)
connection.close()
0 голосов
/ 03 ноября 2017

Вот краткая версия:

from django.core.mail import get_connection, EmailMultiAlternatives

def send_mass_html_mail(subject, message, html_message, from_email, recipient_list):
    emails = []
    for recipient in recipient_list:
        email = EmailMultiAlternatives(subject, message, from_email, [recipient])
        email.attach_alternative(html_message, 'text/html')
        emails.append(email)
    return get_connection().send_messages(emails)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...