Django在发送电子邮件时会发出信号吗?

时间:2018-06-11 09:26:15

标签: django email logging signals

想知道使用send_mail或send_mass_mail发送电子邮件时是否发出信号以及如何收听这些信号。 或者我必须自己发出信号。

我的用例是我想在发送电子邮件时记录。问题是我不想机械地记录电子邮件的发送,因为这可能分散在应用程序的许多部分。

1 个答案:

答案 0 :(得分:3)

据我所知,电子邮件没有内置信号,但是,你可以推出自己的解决方案。

我建议您覆盖您的电子邮件后端类并在那里添加日志记录逻辑。 Django中的每个电子邮件后端类都应该有send_messages方法,负责发送消息。您可以在那里添加记录逻辑或从方法中发出信号。

例如:我们假设您'django.core.mail.backends.smtp.EmailBackend'设置为EMAIL_BACKEND中的settings.py

然后将其扩展为:

class LoggedEmailBackend(EmailBackend):

    def send_messages(self, email_messages):
        if not email_messages:
            return
        with self._lock:
            new_conn_created = self.open()
            if not self.connection or new_conn_created is None:
                # We failed silently on open().
                # Trying to send would be pointless.
                return
            num_sent = 0
            for message in email_messages:
                sent = self._send(message)
                if sent:
                    num_sent += 1
                    # DO THE EMAIL LOGGING OR EMIT A SIGNAL HERE.
            if new_conn_created:
                self.close()
        return num_sent

然后在settings.py中设置EMAIL_BACKEND = 'custom.backends.LoggedEmailBackend'

现在通过此电子邮件后端的所有电子邮件都会被记录或发出信号(取决于您决定选择的方法)。