Как использовать recipient-variables от Mailgun с почтовым бэкендом Django SMTP?
Как правильно отправлять пакетные/массовые электронные письма с помощью MailGun в Django по протоколу SMTP?
Что я пробовал до сих пор?
- Я использую
django.core.mail.backends.smtp.EmailBackend
в качествеEMAIL_BACKEND
.
и вот фрагмент кода, который я пытался отправить по электронной почте.
from django.core.mail import EmailMultiAlternatives
import json
to_emails = [
"mail_1@example.com",
"mail_2@example.com",
"mail_3@example.com",
"mail_4@example.com",
"jerinpetergeorge@gmail.com",
]
mail = EmailMultiAlternatives(
subject="Hey - %recipient.name%",
body="Hey %recipient.name%,\n\nThis is just a batch email test!!!",
from_email="JPG <me@somehost.com>",
to=to_emails,
)
recipient_variables = {
address: {"name": address} for address in to_emails
}
mail.extra_headers["X-Mailgun-Recipient-Variables"] = json.dumps(recipient_variables)
response = mail.send()
print(response)
и я получил почту, как указано ниже,
Как мы видим, атрибут to
заполнен всеми адресами электронной почты, чего я не ожидаю.
Итак, как я могу сказать Mailgun/Django правильно анализировать мои переменные, чтобы письма выглядели более индивидуально?
Примечания
- Я предпочитаю использовать протокол SMTP
- Я попробовал REST API Mailgun и это было успешно (но я предпочитаю SMTP)
- Я нашел django-anymail и, кажется, у него есть эта функция. Но, он также использует API (поправьте меня, если я ошибаюсь)
Как мы видим, атрибут
to
заполнен всеми адресами электронной почты, что не является тем, чего я ожидаю.
В Mailgun не поддерживается должным образом SMTP.
Однако, полагаясь на (неинтуитивную) реализацию BCC в Mailgun, есть обходной путь:
mail = EmailMultiAlternatives(
subject="Hey - %recipient.name%",
body="Hey %recipient.name%,\n\nThis is just a batch email test!!!",
from_email="JPG <me@somehost.com>",
# to=to_emails, # Replace this
bcc=to_emails, # with this
)
recipient_variables = {
address: {"name": address} for address in to_emails
}
mail.extra_headers["To"] = "%recipient%" # Add this
mail.extra_headers["X-Mailgun-Recipient-Variables"] = json.dumps(recipient_variables)
- Почему
to=["%recipient%"]
не работает с SMTP?
Это стандарт в протоколе.
From https://documentation.mailgun.com/_/downloads/en/latest/pdf/:
SMTP-отправка выдаст ошибку "cannot parse to address" или "cannot parse from address", если предоставленный адрес электронной почты не пройдет синтаксическую проверку в соответствии с RFC5321, RFC5322, RFC6854.
- Что нужно сделать для правильной поддержки пакетной отправки с Mailgun?
Используйте API.
From https://stackoverflow.com/questions/30787399/laravel-5-sending-group-emails (мультипостинг в https://laracasts.com/discuss/channels/laravel/sending-email-to-1000s-of-reciepents):
До сих пор я создавал массив адресов электронной почты получателей, отправлял письмо на адрес типа веб-мастера и включал конечных получателей в BCC
.Хотя это работает, это не идеально.
Вместо того, чтобы использовать встроенные в Laravel функции
.Это также позволяет мне получить доступ к уникальным переменным получателя в шаблоне электронной почты
(Это не специфично для Laravel/PHP, а для SMTP через Mailgun.)
- Что вы имеете в виду под "неинтуитивной" реализацией BCC в Mailgun?
Mailgun эффективно персонализирует письмо для каждого получателя BCC с помощью переменных получателя.
From https://github.com/mailgun/mailgun-js-boland/issues/89:
лицо bcc получает письмо в том виде, в котором оно было адресовано ему, вместо того, чтобы быть частью bcc
Это вызывает отдельную проблему, когда вы хотите, чтобы получатели BCC получили то же содержимое.
В копии, отправленной на адрес bcc, не выполнена подстановка recip_vars.
По словам добрых людей из Mailgun, это невозможно, по крайней мере, в текущем релизе сервиса.