
У меня есть собственный почтовый сервер. Он использует QMail. Я понимаю, что здесь есть по крайней мере две проблемы: все крутые ребята используют Gmail для своей электронной почты почти всегда, и кто, черт возьми, вообще использует QMail?
Как и в большинстве подобных ситуаций, это происходит по историческим причинам. И, конечно же, я хотел бы изменить текущую ситуацию, но в большинстве случаев она работает достаточно хорошо, так что случайная боль, которую она мне причиняет, не стоит боли, связанной с изменением настроек.
Итак, я здесь. Один из примерно трех человек в мире, которые все еще используют почтовый сервер с использованием QMail. И это иногда доставляет мне проблемы.
Одной из проблем является управление почтовыми очередями. Инструменты, которые QMail предоставляет вам для проверки содержимого очередей и удаления ненужных сообщений, довольно примитивны. Кажется, что все используют сторонние инструменты. Пару лет назад у меня была скомпрометированная установка WordPress, которая использовалась для отправки тысяч сообщений электронной почты случайным людям. Исходящая очередь была заполнена спамом, а входящая очередь была заполнена рикошетами. Я остановил QMail и начал искать способ аккуратно удалить все плохие сообщения, сохранив при этом крошечное количество законных.
Я обнаружил программу под названием qmHandle, которая делала именно то, что я хотел. Это позволило мне удалить сообщения из обеих очередей, которые соответствовали различным критериям, и вскоре я снова вернулся к работе (также очистив установку WordPress и усилив ее безопасность).
Программа qmHandle была написана на Perl. И я всегда думал, что в какой-то момент я пересматриваю программу и что-то даю взамен, исправляя или улучшая ее каким-то образом. Несколько месяцев назад я нашел время, чтобы сделать это.
Я начал с просмотра кода. И понял, что это в значительной степени было написано так, чтобы его было как можно сложнее поддерживать. Хорошо, это, вероятно, неправда, но это определенно не было написано для того, чтобы быть особенно простым для понимания. То, что создал первоначальный автор, Мишель Белтраме, было действительно полезным, но мне показалось, что он сделал это для себя гораздо сложнее, чем нужно.
Так я нашел свой проект. Я хотел взломать qmHandle. Но прежде чем я смог это сделать, мне нужно было переписать его, чтобы с ним было легче работать. Это стало чем-то, чем я занимался в считанные минуты в течение нескольких недель. Новая версия находится на Github. Я начал с импорта исходной версии, поэтому интересно почитать историю коммитов, чтобы проследить внесенные мной изменения. Я думаю, что было три основных области, в которых я что-то улучшил.
- Разделение большей части логики на модуль. Я говорю «большинство», но на самом деле это все. Программа командной строки теперь приятно проста:
QMail::QueueHandler->new->run
- Улучшение (под чем я в основном подразумеваю упрощение) логики и синтаксиса. Я переместил несколько объявлений переменных (чтобы их область действия была меньше) и переименовал некоторые, чтобы их значение было более очевидным. Да, и я добавил пару полезных модулей CPAN — Term::ANSIColor и Getopt::Std.
- Использование лося. Переход на объектно-ориентированный подход в целом был большой победой, и Moose сделал это намного проще, чем это было бы в противном случае. В какой-то момент в будущем я мог бы подумать о переходе с Moose на Moo по соображениям производительности.
Вот уже несколько недель я использую исправленную версию на своем почтовом сервере, и, похоже, она работает почти так же, как и исходная версия. Так что пришло время выпустить его в широкий мир. Сегодня днем я опубликовал это в CPAN. Я уже говорил выше, что количество людей, использующих QMail для обработки своей электронной почты, ничтожно мало. Но если вы относитесь к этой группе и вам нужен более мощный способ управления почтовыми очередями, то новая версия qmHandle вполне может вам пригодиться.
Есть несколько вещей, которые я знаю, что мне нужно сделать.
- Больше тестов. Основная цель переноса большей части кода в модуль заключалась в том, чтобы упростить его тестирование. Теперь пришло время доказать это. Текущий набор тестов крошечный. Мне нужно улучшить это.
- Конфигурация. В настоящее время конфигурация жестко запрограммирована. И разные системы могут нуждаться в различной конфигурации (например, очереди могут храниться в другом каталоге). Должен быть простой способ настроить это.
- Исправления ошибок и улучшения. В конце концов, именно поэтому я начал этим заниматься. Я не знаю, что это может быть, но я уверен, что есть способы улучшить программу.
Я надеюсь, что хоть кто-то найдет это полезным.
Первоначально опубликовано на Perl Hacks.