我正在开发一个 Django 项目,并使用 Anymail 和 Mailgun 来发送电子邮件。
我有两个域指向同一网站domain1.com 和domain2.com
我将 mailgun 的两个 senver 域设置为 mg.domain1.com 和 mg.domain2.com,并使用它们的 api 密钥。
当设置为默认域发件人时,两个域都工作正常。
我需要发送客户电子邮件并根据他们是域 1 还是域 2 的用户进行切换。因为我希望 serder 电子邮件将是 [电子邮件受保护] 和 [电子邮件受保护],具体取决于用户。
在我的settings.py中,我有以下配置:
ANYMAIL = {
'MAILGUN_API_KEY': API_KEY_DOMAIN1,
'MAILGUN_SENDER_DOMAIN': SENDER_DOMAIN_1'],
}
EMAIL_BACKEND = 'anymail.backends.mailgun.EmailBackend'
SERVER_EMAIL = [email protected]
DEFAULT_FROM_EMAIL = Domain 1 <[email protected]>
这里是发送电子邮件代码:
email = AnymailMessage(
to=message.to.split(','),
cc=message.cc.split(',') if message.cc else None,
bcc=message.bcc.split(',') if message.bcc else None,
reply_to=None,
subject=message.notification.subject,
body=message.notification.body_text,
from_email=message.from_email,
)
email.attach_alternative(message.notification.body_html, 'text/html')
if user.brand['name'] == 'domain2':
email.esp_extra = {
'sender_domain': SENDER_DOMAIN_2,
'api_key': API_KEY_DOMAIN2,
}
try:
email.send()
except Exception as e:
print('Error sending email:', e)
如你所见。我尝试使用 esp_extra 在发件人域之间切换,但我得到:
anymail.exceptions.AnymailRequestsAPIError: Mailgun API response 401 (Unauthorized): 'Forbidden'
什么可能导致此问题,如何解决?
esp_extra
必须包含来自 Mailgun 的 发送电子邮件 API 请求正文的字段(当使用 Anymail 的 Mailgun EmailBackend 时)。 'sender_domain'
和 'api_key'
不是 Mailgun 的 API 的有效字段,这就是您的请求失败的原因。
要覆盖特定消息的设置,一种方法是使用 Django 的
connection
创建您自己的
get_connection()
:
from django.core.mail import get_connection
email = AnymailMessage(...) # your code as before
if user.brand['name'] == 'domain2':
# Override the connection for this message
email.connection = get_connection(
"anymail.backends.mailgun.EmailBackend",
api_key=API_KEY_DOMAIN2,
sender_domain=SENDER_DOMAIN_2,
)
email.send() # as before
(Anymail 的文档中有一个这样的示例。)
此外,默认情况下 Anymail 使用 from_email
from_email
始终设置为
[email protected]
或
[email protected]
,那么您可以让 Anymail 自动检测发件人域:摆脱
"MAILGUN_SENDER_DOMAIN"
设置并跳过上面代码的
sender_domain
部分。