Упрощаем фильтрацию уведомлений от web-сервисов

    У любого серьезного web-сервиса есть собственная система уведомлений по электронной почте. Отправка email-сообщений сопровождает регистрацию пользователя, используется для восстановления пароля и подтверждения важных действий, письма-алерты напоминают о наступлении определенных событий. Еще больше сообщений получают администраторы и модераторы сервисов — им сообщают зачастую о «каждом чихе» их подопечных.

    Весь этот поток сообщений, сдобренный личными письмами и густо перемешанный со спамом, валится на единственный почтовый ящик, после чего встает задача «отделения зерен от плевел» и приведение первых в некоторую структуру, позволяющую потом разобраться, где что. Для фильтрации писем в них должна быть некая информация, позволяющая почтовому клиенту определить, как обработать данное письмо. Вариантов, собственно, немного, и все они отражены в списке условий фильтра сообщений. Можно отправлять письма с разными темами с разных адресов (использовать различные name в name@domain.tld для каждого типа сообщений). Можно использовать тему письма или добавлять в нее специальные префиксы типа [SERVICE-EVENT]. Все это не улучшает читаемость сообщений и может приводить к различным проблемам. Однако есть способ, свободный от этих недостатков.

    Согласно стандартам на email-сообщения (например, RFC 2822), в заголовке письма допускается любое количество необязательных полей, которые могут содержать любую информацию. Главное условие — имена таких полей не должны совпадать со стандартными. Для гарантированного отсутствия совпадений договорились, что такие поля будут начинаться с префикса «X-» (латинская буква «икс» и знак «минус»). Понятно, что поля также должны следовать общим стандартам, в частности, иметь длину строки не более 998 символов (рекомендуется не более 78 символов). При переносе значения на следующую строку комбинацию CRLF (возврат каретки, код 13, затем перевод строки, код 10) необходимо вставлять перед пробельным символом.

    Применительно к нашей проблеме фильтрации сообщений предлагается следующее: в каждое отправляемое сервисом сообщение включать как минимум поле идентификатора типа события (например, X-Event-Type), в котором описывать (разумеется, коротким словосочетанием на латинице — для компьютера пишем, не для человека), чем вызван приход данного сообщения. Например, для админа X- Event-Type: NewUser будет сопровождать письма о регистрации нового пользователя, а для модератора форума X-Event-Type: MsgBadWords будет уведомлять о срабатывании фильтра нецензурных слов для нового сообщения. Тогда в фильтре почтового клиента легко создается правило, которое будет отбирать письма с нужным значением заданного поля и класть их в соответствующую папку. В частности, в популярном Thunderbird, для задания нового имени поля нужно выбрать строчку «Настроить» в самом конце списка полей в условии. Приятным дополнительным эффектом будет автоматическая защита от спама, ведь никто из спамеров не будет рассылать письма с персональным для вас значением «какого-то непонятного нигде не описанного» поля.

    О реализации: дополнительные поля в заголовок сообщения легко добавляются средствами вашего языка — читайте документацию на функции, которыми вы отправляете почту. Например, в PHP функция mail своим четвертым аргументом принимает строку с дополнительными полями заголовка, разделенными CRLF. Если же вы полностью вручную составляете сообщение перед тем как отдать его sendmail или другому MTA, то вписать нужные поля в заголовок еще проще.

    Разумеется, можно и нужно добавлять другие поля заголовка, если это поможет обработке сообщений, в соответствии с характером web-сервиса. Я не привожу готового решения, а лишь представляю идею, способ, который может помочь вам в улучшении своего проекта.
    Поделиться публикацией

    Комментарии 3

      0
      Данный способ, не является новым, я встречал реализацию подобных систем с использованием доп. полей. Главное не светить такие поля при рассылки с сайта.)
        0
        Проблема только в том, что если к тебе ежедневно валится огромное кол-во таких сообщений с разных ресурсов, то это нужно лезть в каждый и настраивать эти заголовки где-то в коде, вообщем проделать массу работы, а ведь зачастую можно все сортировать и по теме и по адресу отправителя.
          0
          Ну если подумать об этом при написании кода отправки уведомлений, то потом будет проще. Благо дополнительное поле заголовка, в отличие от темы, снаружи глаза не мозолит.

          С темой еще проблема — она обычно зависит от языка, если его переключить, то все фильтры придется перенастраивать. Или, при очередном обновлении версии локализацию «слегка» поправили — тоже все слетело.

          Поэтому тема хороша для людей, а для машин лучше использовать спецсредства.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое