使用Sentry避免Mandrill错误

时间:2014-05-29 20:00:29

标签: python django mandrill sentry

我在服务器上安装了Sentry实例,我想将其配置为使用Mandrill及其Django集成djrill发送警报电子邮件。这是我使用的sentry.conf.py文件中的相关设置:

EXTRA_INSTALLED_APPS = (
    'djrill',
)
EMAIL_BACKEND = 'djrill.mail.backends.djrill.DjrillBackend'

MANDRILL_API_KEY = '[... Mandril API key ...]'
DEFAULT_FROM_EMAIL = 'my-mandrill-allowed@email.address'
SERVER_EMAIL = 'my-mandrill-allowed@email.address'

此设置有效,但由于某些原因,Mandrill不允许设置Message-Id标题的部分除外:

NotSupportedByMandrillError: Invalid message header 'Message-Id' - Mandrill only allows Reply-To and X-* headers

(djrill提出此异常,不是Mandrill的回复)

由Sentry here设置:

class MessageBuilder(object):
    # ...
    @cached_property
    def message_id(self):
        if self.reference is not None:
            return email_id_for_model(self.reference)

我已设法通过编辑该方法使其工作并使其始终返回None,因此在电子邮件中未设置Message-Id标头。但我不想编辑/修补第三方代码,我不知道其他地方是否需要这个标题。

如何正确完成此操作?目前无法从Mandrill切换。

谢谢!

1 个答案:

答案 0 :(得分:0)

根据我的意思,您可以轻松改变Sentry的行为,我建议实施一个DjrillBackend的子类,删除Message-Id标题在发送消息之前。像(未经测试)的东西:

class HeaderRemovingBackend(DjrillBackend):
    def send_messages(self, email_messages):
        for message in email_messages:
            if 'Message-Id' in message.extra_headers:
                del message.extra_headers['Message-Id']
        super(HeaderRemovingBackend, self).send_messages(email_messages)