Как отправить пакетное письмо с помощью почтового знака в Anymail для Django?
Я хочу использовать Anymail API для почтовых отметок в моем django-приложении. Это не то же самое, что поместить список адресов электронной почты в cc, но я пытаюсь отправить отдельное письмо на каждый отдельный адрес электронной почты (содержание письма при этом остается тем же). Сейчас у меня есть следующее средство для отправки транзакционных (одноразовых) писем. Мне нужно, чтобы это работало и с html-содержимым!
from anymail.message import AnymailMessage
email = AnymailMessage(
subject=subject,
body=body,
from_email=from_email,
to=to,
)
email.attach_alternative(html_content, "text/html")
email.esp_extra = {
'MessageStream': message_stream, # Specify the message stream
}
Сначала я пытался использовать цикл for для отправки отдельного письма на каждый адрес электронной почты, но это занимало слишком много времени, и страница не могла загружаться достаточно долго. Как я могу реализовать пакетную отправку писем в django с помощью Anymail? Спасибо, и, пожалуйста, оставьте комментарий, если у вас есть вопросы.
Для ESP, которые поддерживают эту функцию, Anymail использует пакетную отправку, если вы установили для сообщения свойства merge_data
, merge_metadata
или merge_headers
.
Из Пакетная отправка/слияние и шаблоны ESP на странице документации Anymail's Postmark:
При указании каждого получателя
merge_data
, Anymail автоматически переключается на API пакетной отправки Postmark, так что каждый получатель "Кому" видит только свой собственный адрес электронной почты. (Любые адреса cc или bcc будут дублируются для каждого получателя.)Если вы хотите использовать пакетную отправку с обычным сообщением (без шаблона), установите значение merge data в пустой dict:
message.merge_data = {}
.
Однако при наличии ошибок пакетная отправка может затруднить определение получателей, которым было или не было отправлено письмо. Часто лучше перебрать все адреса и отправить отдельные сообщения, как вы делали раньше. Если при этом возникают задержки, хорошим вариантом будет перенести фактическую отправку в отдельный поток или процесс, используя что-то вроде django-mailer или django-celery-email. Дополнительную информацию см. в документации по Anymail Handling transient errors.