Как использовать recipient-variables от Mailgun с почтовым бэкендом Django SMTP?

Как правильно отправлять пакетные/массовые электронные письма с помощью MailGun в Django по протоколу SMTP?

Что я пробовал до сих пор?

и вот фрагмент кода, который я пытался отправить по электронной почте.

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)

и я получил почту, как указано ниже, Received Email

Как мы видим, атрибут 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)

Ссылка: https://stackoverflow.com/questions/37948729/mailgun-smtp-batch-sending-with-recipient-variables-shows-all-recipients-in-to-field


  1. Почему to=["%recipient%"] не работает с SMTP?

Это стандарт в протоколе.

From https://documentation.mailgun.com/_/downloads/en/latest/pdf/:

SMTP-отправка выдаст ошибку "cannot parse to address" или "cannot parse from address", если предоставленный адрес электронной почты не пройдет синтаксическую проверку в соответствии с RFC5321, RFC5322, RFC6854.

  1. Что нужно сделать для правильной поддержки пакетной отправки с 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 функции Mail, я решил использовать API Mailgun (в частности, пакетную отправку) напрямую

.

Это также позволяет мне получить доступ к уникальным переменным получателя в шаблоне электронной почты

(Это не специфично для Laravel/PHP, а для SMTP через Mailgun.)

  1. Что вы имеете в виду под "неинтуитивной" реализацией BCC в Mailgun?

Mailgun эффективно персонализирует письмо для каждого получателя BCC с помощью переменных получателя.

From https://github.com/mailgun/mailgun-js-boland/issues/89:

лицо bcc получает письмо в том виде, в котором оно было адресовано ему, вместо того, чтобы быть частью bcc

Это вызывает отдельную проблему, когда вы хотите, чтобы получатели BCC получили то же содержимое.

From https://stackoverflow.com/questions/48887866/bcc-in-mailgun-batch-send-does-not-include-substitutions:

В копии, отправленной на адрес bcc, не выполнена подстановка recip_vars.

По словам добрых людей из Mailgun, это невозможно, по крайней мере, в текущем релизе сервиса.

Вернуться на верх