Жил да был на нашем MX-сервере антивирус AVAST. Про его настройку я
писал ранее, это цирк с конями, но деньги уплочены, приходится пользоваться. Аваст был прикручен к postfix-у, и работал как внешний smtp фильтр настроенный через master.conf.
В один прекрасный момент начали жаловаться пользователи, что некоторые письма приходят обрезанными или без вложений. Расследование показало, что письма укорачиваются в момент прохождения через это самый Avast.
Попробовали воссоздать ситуацию и выяснили, что обрезка происходит, если в теле письма есть строка состоящая из одинокой точки
.
Как вы знаете, в протоколе smtp строка состоящая из одной точки является знаком окончания письма. Для того, что бы это знание не требовалось рядовому пользователю, в RFC2812 есть специальная глава 4.5.2 "Transparency", в которой описывается, как клиент должен обработать подобную строку перед отправкой на сервер:
- Before sending a line of mail text, the SMTP client checks the
first character of the line. If it is a period, one additional
period is inserted at the beginning of the line.
То есть если строка начинается с точки, то программа клиент должна добавить еще одну точку в начале строки.
Сервер, в свою очередь, получив такую строку, удаляет лишнюю точку, приводя письмо к первоначальному виду.
Так вот, недалекий аваст не выполняет это требование RFC и не добавляет лишнюю точку, соответственно Postfix, получив письмо обратно после проверки на вирусы, со спокойной совестью обрезает его.
Переписка с суппортом аваста ничего не дала - на общее описание проблемы они посоветовали поставить какую-то сложную систему подключения внешних фильтров, а на письмо с указанием точного места ошибки они вообще не ответили :(
Были б доступны исходники, дел то на 5 минут, две строчки поправить, но при работе с проприетарным софтом приходится надеяться только на сознательность разработчиков.
Кастинг на роль нового почтового антивируса выиграл ClamAV, но о нем мы расскажем в следующей главе.