如何在 django-anymail 中配置两个服务器域

问题描述 投票:0回答:1

我正在开发一个 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'

什么可能导致此问题,如何解决?

django mailgun django-anymail
1个回答
0
投票

Anymail 的

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
 部分。

© www.soinside.com 2019 - 2024. All rights reserved.