【问题标题】:Does Django emit signals when email messages are sent?发送电子邮件时,Django 会发出信号吗?
【发布时间】:2018-11-20 12:12:15
【问题描述】:

想知道使用 send_mail 或 send_mass_mail 发送电子邮件时是否发出信号以及如何监听它们。 还是我必须自己发出信号。

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

【问题讨论】:

    标签: django email logging signals


    【解决方案1】:

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

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

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

    然后将其扩展为:

    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'

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-21
      • 2014-09-22
      • 2021-08-10
      • 2011-10-18
      • 2020-08-17
      • 2021-10-09
      • 2022-11-01
      相关资源
      最近更新 更多