首页 > 解决方案 > 如何在 Django 中获取 SMTP 服务器响应代码?

问题描述

目标:

你好!如何通过 Django 获取 SMTP 响应代码,类似于从smtplib模块给出的返回值???我想使用 Django 的 api 而不是必须使用它,而且我在Django 的电子邮件文档中什么也看不到。

我知道send_mail(), send_mass_mail(), 并且EmailMessage.send_messages(...)都有返回值,显示成功传递的消息的数量......但我想要所有这些的响应代码。关键是要证明已发送电子邮件、错误的电子邮件地址等,例如smtp 响应代码显示。

它在我看来就像我必须为此制作一个自定义电子邮件后端,并从BaseEmailBackend...子类化smtplib无论如何都在使用。

smtplib的响应代码的示例代码

import smtplib
obj = smtplib.SMTP('smtp.gmail.com', 587)
response = obj.ehlo()
print(response)

# Obviously this doesn't send a message yet, but I want response[0]
(250, b'smtp.gmail.com at your service, [111.222.33.44]\nSIZE 31234577\n8BITMIME\nSTARTTLS\nENHANCEDSTATUSCODES\nPIPELINING\nCHUNKING\nSMTPUTF8')

标签: pythondjangoemaildjango-2.0django-3.0

解决方案


如果您只想检查邮件是否已发送,您可以使用send_mail()函数的返回值

返回值将是成功传递的消息数(可以是 0 或 1,因为它只能发送一条消息)。

Django 确实捕获 smtplib 错误并在发生任何错误时返回 0,如果 fail_silently 为 false(默认为 true)则返回异常

django.core.mail.backends.smtp.EmailBackend_send():

try:
    self.connection.sendmail(from_email, recipients, message.as_bytes(linesep='\r\n'))
except smtplib.SMTPException:
    if not self.fail_silently:
            if not self.fail_silently:
            raise
        return False
    return True

同样的事情open()


推荐阅读