Избегайте ошибок 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 = '[email protected]'
SERVER_EMAIL = '[email protected]'

И эта настройка работает, за исключением того, что Mandrill почему-то не позволяет установить заголовок Message-Id:

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

(Это исключение вызвано djrill, а не ответом Mandrill)

Который устанавливается Sentry здесь:

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 сейчас невозможен.

Спасибо!


person Armando Pérez Marqués    schedule 29.05.2014    source источник


Ответы (1)


Поскольку вы не можете легко изменить поведение 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)
person sk1p    schedule 29.05.2014
comment
Ну, я решил это, установив последнюю версию Djrill. Но я собираюсь принять этот ответ, потому что я собирался реализовать его, если обновление было бы невозможно. Спасибо! - person Armando Pérez Marqués; 30.05.2014