Django: 通过Office365发送电子邮件

6

我拥有的:

  • 在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'

但它没有起作用。因此,仅为了测试,我尝试了免费的Google SMTP服务器:

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'john@gmail.com'
EMAIL_HOST_PASSWORD = 'yyyyyy'

这次它可以工作,但是显然,电子邮件是从john@gmail.com而不是john@contoso.com发送的。

在之前的配置中出了什么问题?还是我需要在我的Office 365帐户中做一些更改?


更新

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

ADMINS = [('Admin Name', 'admin@gmail.com')]

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

logging.error("Hello admin!!")

如上所述,此方法仅适用于使用smtp.gmail.com。今天我尝试使用send_mail函数:

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

这个功能可以同时使用smtp.gmail.comsmtp.office365.com, 但是对我来说这并不是一个有效的解决方案,因为如果出现错误或异常,我需要通知管理员。那么为什么send_mail函数可以使用smtp.office365.comADMIN设置却不能呢?


1
这取决于您的帐户配置。例如,如果您的帐户启用了2FA,则必须使用应用程序密码。也许更好的选择是使用Graph API(我不太熟悉Python,所以不会向您解释详细信息)。这是SendMail方法文档页面 - Robert Dyjas
你在O365中遇到了什么错误? - Hannel
5个回答

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)

那么现在只需要将电子邮件和密码提供给您的应用程序即可。此外,在 Linux 的环境变量中,避免使用带有 # 符号的密码,因为它们特别难以转义。点击此处了解更多信息

4
使用Office365 SMTP服务器发送电子邮件时,“from”用户和“host”用户必须相同。因此,我在Django中添加了此设置以向管理员发送电子邮件:
SERVER_EMAIL = EMAIL_HOST_USER

3

这不是Django,只是使用PowerShell确认SMTP中继是否正常工作。确保发件人地址与用于身份验证的帐户相同。也尝试使用SSL。

https://i.imgur.com/bS04QMh.png

https://i.imgur.com/sERhkKg.png


1
你好,感谢您的回复。我尝试使用PowerShell发送电子邮件,使用以下指令 Send-MailMessage -From "john@contoso.com" -to "john@gmail.com" -Subject "subject" -Body "body" -SmtpServer "smtp.office365.com" -port "587" -UseSsl -Credential (Get-Credential) -DeliveryNotificationOption OnSuccess 并且它可以正常工作(我使用了在Django中使用的相同凭据)。不幸的是,我仍然无法通过Django应用程序发送电子邮件。 - El_Merendero
我在Django和Office 365中都没有遇到任何错误。不过,我还注意到另一种奇怪的行为(请参阅我的问题更新章节)。 - El_Merendero

0

经过几天的尝试,唯一有效的方法是:

DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

0
有些自我推广,但希望对您有所帮助:
如今SMTP认证不太受欢迎,因此我为Django制作了一个电子邮件后端,可以通过Office 365 API进行身份验证。您可以在这里找到它:https://pypi.org/project/django-o365mail/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接