Django:通过Office365发送电子邮件

El_*_*ero 6 django smtp office365

我拥有的:

  • 在 webs.com 中购买的域(我将其称为 contoso.com);
  • 连接到该域的 Office 365 帐户(我的电子邮件地址类似于john@contoso.com);
  • 托管在 Azure 中的 Django 应用程序;

我想要的是:

我想配置 Django 以使用我的john@contoso.com地址发送电子邮件。

我做了什么:

我尝试了这个 Django 配置:

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.office365.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'john@contoso.com'
EMAIL_HOST_PASSWORD = 'xxxxxx'
Run Code Online (Sandbox Code Playgroud)

但没有成功。因此,为了测试,我尝试了免费的 Google SMTP 服务器:

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'john@gmail.com'
EMAIL_HOST_PASSWORD = 'yyyyyy'
Run Code Online (Sandbox Code Playgroud)

这次它起作用了,但显然,电子邮件是从 发送的john@gmail.com,而不是从 发送的john@contoso.com

之前的配置有什么问题吗?或者我可能需要对我的 Office 365 帐户进行一些更改?


更新

到目前为止,我尝试通过以下方式设置 Django 的 ADMINS 变量来接收电子邮件:

ADMINS = [('Admin Name', 'admin@gmail.com')]
Run Code Online (Sandbox Code Playgroud)

然后我使用日志记录对象发送电子邮件:

logging.error("Hello admin!!")
Run Code Online (Sandbox Code Playgroud)

如前所述,这仅在我使用时才有效smtp.gmail.com。今天我尝试使用该send_mail功能:

send_mail(
    'Subject here',
    'Here is the message.',
    'john@gmail.com',
    ['mail@gmail.com'],
    fail_silently=False,
)
Run Code Online (Sandbox Code Playgroud)

它既可以使用smtp.gmail.com也可以smtp.office365.com配置。不幸的是,这对我来说不是一个有效的解决方案,因为我需要在出现错误或异常时通知管理员。那么,为什么该send_mail功能可以工作smtp.office365.comADMIN设置却不能呢?

jla*_*rcy 5

这篇文章是此处找到的提案的综合。

截至 2022 年 4 月,这个完整的配置对于本机 django 电子邮件配置来说就像一个魅力:

EMAIL_HOST = os.getenv("APP_EMAIL_HOST", "smtp.office365.com")
EMAIL_PORT = os.getenv("APP_EMAIL_PORT", 587)
EMAIL_HOST_USER = os.getenv("APP_EMAIL_HOST_USER")
SERVER_EMAIL = EMAIL_HOST_USER
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
EMAIL_HOST_PASSWORD = os.getenv("APP_EMAIL_HOST_PASSWORD")
EMAIL_USE_TLS = os.getenv("APP_EMAIL_USE_TLS", True)
EMAIL_TIMEOUT = os.getenv("APP_EMAIL_TIMEOUT", 60)
Run Code Online (Sandbox Code Playgroud)

然后就是为您的应用程序配置电子邮件和密码。#此外,请避免在 Linux 环境变量中使用密码,因为它们特别难以逃脱


El_*_*ero 4

要使用 Office365 smtp 服务器发送电子邮件,“发件​​人”用户和“主机”用户必须相同。因此,我在 Django 中添加了此设置,以便向管理员发送电子邮件:

SERVER_EMAIL = EMAIL_HOST_USER