У любого серьезного 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-сервиса. Я не привожу готового решения, а лишь представляю идею, способ, который может помочь вам в улучшении своего проекта.
Весь этот поток сообщений, сдобренный личными письмами и густо перемешанный со спамом, валится на единственный почтовый ящик, после чего встает задача «отделения зерен от плевел» и приведение первых в некоторую структуру, позволяющую потом разобраться, где что. Для фильтрации писем в них должна быть некая информация, позволяющая почтовому клиенту определить, как обработать данное письмо. Вариантов, собственно, немного, и все они отражены в списке условий фильтра сообщений. Можно отправлять письма с разными темами с разных адресов (использовать различные 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-сервиса. Я не привожу готового решения, а лишь представляю идею, способ, который может помочь вам в улучшении своего проекта.
