FreeBSD: Дополнительные возможности PostfixAdmin

Введение

В данной заметке нет ни слова о том, что такое PostfixAdmin, и как включить его в состав почтовой системы. В Сети есть масса хороших статей на эту тему. Лично я «прикручивал» PostfixAdmin к почтовой системе среднего офиса на базе Postfix по статье Алексея (aka ALex_hha) Настройка почтовой системы на freebsd. Часть I. Данная заметка дополняет имеющиеся статьи и рассматривает такие возможности PostfixAdmin, как: автоответчик, сбор почты, создание групповых алиасов, очистка диска от удаленных через GUI почтовых ящиков. На мой взгляд, эти вопросы слишком кратко рассмотрены в русскоязычных документах, поэтому я решил восполнить пробел.

Исходные данные

Имеется сервер с FreeBSD, на котором кроме всего прочего развернута почтовая система среднего офиса на базе Postfix. Для управления почтовой системой используется PostfixAdmin, настроенный по статье Настройка почтовой системы на freebsd. Часть I. Для включения описанных выше функций PostfixAdmin нам понадобятся Fetchmail (для сбора почты с удаленных серверов) и sudo (для запуска скрипта с привилегиями нужной учетной записи). Все программное обеспечение будет устанавливаться из портов, поэтому я рекомендую Вам обновить их перед выполнением действий, описанных ниже (я использовал FreeBSD 7.0 и последние версии портов для нее). Все имена папок соответствуют стандартным значениям, выбираемым по умолчанию при установке программного обеспечения из портов.

Автоответчик

Автоответчик предназначен для того, чтобы сотрудник, собирающийся, например, в отпуск, мог задать сообщение, которое будет отправляться в ответ на поступающие в его адрес сообщения, чтобы корреспонденты узнали, когда он вернется, к кому можно обратиться во время его отсутствия и т.п. Ниже показан скриншот окна, в котором можно задать сообщение автоответчика (по понятным причинам почтовые адреса и URL’ы скрыты):

Добавление сообщения автоответчика

При выполнении действий, описанных в данном разделе, я руководствовался документом INSTALL.TXT, находящемся в /usr/local/www/postfixadmin/VIRTUAL_VACATION.
Для настройки автоответчика в первую очередь необходимо создать пользователя vacation и группу vacation, от имени которых будет работать скрипт vacation.pl, создать домашнюю папку пользователя vacation, поместить в нее скрипт vacation.pl, а также соответствующим образом изменить владельца папки и права скрипта:

pw group add vacation -g 65501
pw user add vacation -g vacation -s /sbin/nologin -u 65501
mkdir /var/spool/vacation
cd /var/spool/vacation
cp /usr/local/www/postfixadmin/VIRTUAL_VACATION/vacation.pl .
chown -R vacation:vacation .
chmod 500 vacation.pl

Затем необходимо подправить скопированный ранее скрипт vacation.pl. В частности, следует изменить строки, определяющие тип используемой базы данных, имя пользователя / пароль / имя базы данных:

my $db_type = 'mysql';
my $db_username = 'postfix';
my $db_password = 'postfix';
my $db_name = 'postfix';

После этого необходимо добавить определение транспорта vacation в файл master.cf, находящийся в /usr/local/etc/postfix:

vacation unix - n n - - pipe flags=Rq user=vacation argv=/var/spool/vacation/vacation.pl
  -f ${sender} -- ${recipient}

Если по соображениям безопасности Ваша файловая система /var имеет атрибут noexec (моя имеет), добавьте в командную строку путь к интерпретатору Perl, иначе скрипт vacation.pl не сможет запускаться:

vacation unix - n n - - pipe flags=Rq user=vacation argv=/usr/bin/perl -w /var/spool/vacation/vacation.pl
  -f ${sender} -- ${recipient}

Далее следует добавить строку, определяющую транспорт vacation, в файл transport, находящийся в /usr/local/etc/postfix и являющийся таблицей транспортов. Формат данного файла описан в transport(5). Добавляемая строка имеет вид:

autoreply.company.com vacation:

После изменения файла transport необходимо выполнить команду postmap, указав в качестве аргумента имя файла transport. Домен autoreply.company.com является абстрактным, т.е. не нуждается в регистрации соответствующих записей в DNS, достаточно добавить запись об этом домене в файл /etc/hosts:

127.0.0.1 autoreply.company.com

Далее необходимо откорректировать значение параметра transport_maps в файле main.cf, находящемся в /usr/local/etc/postfix, добавив созданную (измененную) ранее таблицу транспортов:

transport_maps = mysql:/usr/local/etc/postfix/mysql/transport_maps.conf,
  hash:/usr/local/etc/postfix/transport

Остается подправить файл config.inc.php, находящийся в /usr/local/www/postfixadmin, для включения функций управления автоответчиком в интерфейсе PostfixAdmin. В частности, следует изменить строки, определяющие включение автоответчика; домен, используемый автоответчиком; возможность пользователей задавать сообщения автоответчика; возможность администратора изменять эти сообщения:

$CONF['vacation'] = 'YES';
$CONF['vacation_domain'] = 'autoreply.company.com';
$CONF['vacation_control'] = 'YES';
$CONF['vacation_control_admin'] = 'YES';

Теперь можно перезапустить Postfx командой postfix reload и начать пользоваться автоответчиком. При возникновении каких-либо проблем c работой скрипта vacation.pl анализируйте сообщения, которые пишутся в /var/log/messages. В моем случае возникла всего одна несостыковка — отсутствие необходимых модулей Perl, которые были благополучно доустановлены из портов.

Сбор почты

Сбор почты — функция, позволяющая организовать доставку почты из почтовых ящиков, находящихся на удаленных почтовых серверах, в заданные локальные почтовые ящики. Ниже показан скриншот окна, в котором можно задать соответствие между почтовым ящиком на удаленном сервере и одним из локальных почтовых ящиков (по понятным причинам часть почтовых адресов и URL’ов скрыта):

Добавление сообщения автоответчика

Система сбора почты использует утилиты Fetchmail и sudo. Естественно, их нужно установить из портов, если они не были установлены ранее:

cd /usr/ports/mail/fetchmail
make install clean
cd ../../security/sudo
make install clean

Дополнительная настройка Fetchmail и sudo для работы совместно с PostfixAdmin не требуется. После завершения установки необходимо перейти в /usr/local/www/postfixadmin/ADDITIONS и соответствующим образом изменить права скрипта fetchmail.pl:

cd /usr/local/www/postfixadmin/ADDITIONS
chmod +x fetchmail.pl

Затем необходимо подправить скрипт fetchmail.pl. В частности, следует изменить строки, определяющие имя базы данных / имя пользователя / пароль и полное имя исполняемого файла Fetchmail:

$database="postfix";
$user="postfixadmin";
$password="postfixadmin";
$ret=`/usr/local/bin/fetchmail`;

Не торопитесь запускать скрипт fetchmail.pl, т.к. он сможет работать корректно только при запуске от имени владельца папки /var/spool/vmail (пользователя vmail). На форуме PostfixAdmin рекомендуется осуществлять такой запуск с помошью sudo. Для того, чтобы автоматизировать процесс сбора почты, необходимо добавить команду запуска скрипта fetchmail.pl в /etc/crontab. В моем случае опрос удаленных серверов осуществляется каждые 10 минут, и запись в файле /etc/crontab имеет следующий вид:

*/10 * * * * root /usr/local/bin/sudo -H -u vmail /usr/local/www/postfixadmin/ADDITIONS/fetchmail.pl

Остается подправить файл config.inc.php, находящийся в /usr/local/www/postfixadmin, для включения функций управления сбором почты в интерфейсе PostfixAdmin. В частности, следует изменить строку, определяющую включение сбора почты:

$CONF['fetchmail'] = 'YES';

На этом настройка сбора почты заканчивается.

Алиас everyone

В некоторых случаях требуется отправить сообщение всем пользователям почтового домена (разослать какое-то распоряжение руководства, предупреждение и т.п.) Естественно, для этого используется специальный алиас (в моем случае — everyone@company.com), которой нуждается в постоянной корректировке. PostfixAdmin позволяет автоматизировать поддержание этого алиаса в актуальном состоянии.
Для включения поддержки актуального состояния алиаса everyone@company.com в первую очередь необходимо перейти в /usr/local/www/postfixadmin/ADDITIONS и соответствующим образом изменить права скрипта mkeveryone.pl:

cd /usr/local/www/postfixadmin/ADDITIONS
chmod +x mkeveryone.pl

Затем необходимо подправить скрипт mkeveryone.pl. В частности, следует изменить строки, определяющие имя пользователя / пароль, имя домена, и список адресов, которые не следует включать в состав алиаса (скорее всего, это адреса общих папок и служебных пользователей, таких как, например, postmaster и webmaster):

my $userid="postfix";
my $passwd="postfix";
my $domain="company.com";
my @ignore=(
"info@company.com",
...
"webmaster@company.com"
);

Следует отметить, что скрипт mkeveryone.pl позволяет задать свою конфигурацию в отдельном файле. Мне не потребовалась такая функциональность, а Вам она может пригодиться.
Для того, чтобы скрипт mkeveryone.pl запускался автоматически, необходимо добавить соответствующую строку в /etc/crontab. В моем случае скрипт запускается один раз в сутки в 0:15, и запись в /etc/crontab имеет следующий вид:

15 0 * * * root /usr/local/www/postfixadmin/ADDITIONS/mkeveryone.pl

На этом настройка завершается. Если Вы хотя бы немного знаете Perl и SQL, скрипт mkeveryone.pl может служить Вам отличной заготовкой для реализации автоматического создания любых алиасов.

Очистка диска

Как известно, GUI PostfixAdmin осуществляет изменение содержимого базы данных, но не изменяет содержимое жесткого диска. Т.о., при удалении ящика через GUI необходимо вручную удалить соответствующий maildir с жесткого диска. PostfixAdmin позволяет организовать автоматическое удаление ящиков с жесткого, диска, если информация о них была предварительно удалена из базы данных через GUI.
Для включения поддержки автоматической очистки диска от удаленных почтовых ящиков в первую очередь необходимо перейти в /usr/local/www/postfixadmin/ADDITIONS и изменить права скрипта cleanupdirs.pl:

cd /usr/local/www/postfixadmin/ADDITIONS
chmod +x cleanupdirs.pl

Затем необходимо подправить скрипт cleanupdirs.pl. В частности, следует изменить строки, определяющие папку, содержащую почтовые ящики и имя пользователя / пароль для доступа к базе данных:

my $root_path = "/var/spool/vmail";
my $db_username = "postfix";
my $db_password = "postfix";

Для того, чтобы чтобы скрипт cleanupdirs.pl запускался автоматически, необходимо добавить соответствующую строку в /etc/crontab. В моем случае диск очищается один раз в сутки в 0:30, и запись в файле /etc/crontab имеет следующий вид:

30 0 * * * root /usr/local/www/postfixadmin/ADDITIONS/cleanupdirs.pl --delete

На этом настройка завершается. Список удаленных maildir’ов помещается в /var/log/removed_maildirs.log.

Заключение

Выполнив несложную последовательность действий, описанных в статье, Вы сможете повысить функциональность своей почтовой системы и сэкономить время, затрачиваемое на ее поддержку. Актуальность описанных доработок растет по мере увеличения количества абонентов поддерживаемой Вами почтовой системы.

Понравилась статья?

Подпишитесь на RSS или почтовую рассылку;

Присоединяйтесь в Twitter, Facebook, Google+, VK;

Поделитесь ссылкой в социальной сети или блоге:

15 комментариев к “FreeBSD: Дополнительные возможности PostfixAdmin

  1. Привет. Очень понравился цикл статей «FreeBSD — Почтовые системы». Спасибо за твой труд. Теперь буду с интересом следить за новостями вики BSD на твоем сайте.

    • Спасибо за твой труд

      Всегда пожалуйста 🙂

      Теперь буду с интересом следить за новостями вики BSD на твоем сайте

      Надеюсь, что новая версия сайта позволит делать это гораздо удобнее, чем раньше 🙄

  2. Как изменить cleanupdirs.pl чтобы удалять папки удалённых из базы пользователей, если используется такой вариант '/home/vmail/user@domain.tld'.
    В описании файла сказано что надо поменять а как поменять не нашел…

    Вопрос второй: не понятно зачем вот это описание и запуск скрипта в нём: Алиас everyone. Если можно создать алиас и добавить в него необходимыео количество ящиков, причём как админ может это сделать для любого алиаса так и каждый пользователь для своего ящика может. Зачем запуск скрипта mkeveryone.pl? и где смотреть его работу если запустить?

    • Как изменить cleanupdirs.pl чтобы удалять папки удалённых из базы пользователей, если используется такой вариант '/home/vmail/user@domain.tld'.
      В описании файла сказано что надо поменять а как поменять не нашел

      my $root_path = "/var/spool/vmail"; нужно поменять на my $root_path = "/home/vmail";

      Вопрос второй: не понятно зачем вот это описание и запуск скрипта в нём: Алиас everyone. Если можно создать алиас и добавить в него необходимыео количество ящиков, причём как админ может это сделать для любого алиаса так и каждый пользователь для своего ящика может. Зачем запуск скрипта mkeveryone.pl? и где смотреть его работу если запустить?

      Представьте, что в конторе работает несколько сотен человек, а Вы кроме почтового сервера отвечаете еще много за что. Думаю, что сотрудник отдела кадров, который оформляет прием на работу и увольнение с работы не будет поправлять за Вас алиасы и не всегда сообщит об изменении кадрового состава. С другой стороны, если тот, кого Вы не добавили в алиас, не получит важное письмо, то Вам врядли скажут спасибо. Скрипт mkeveryone.pl создает (обновляет) этот алиас. Если у Вас нет подобных проблем, просто не используйте данную возможность. Работу скрипта можно посмотреть в интерфейсе PostfixAdmin — появится алиас everyone@domain.tld.

  3. Предыдущий вопрос задан мной не верно. Вот что есть в файле

    # settings:
    # $root_path = "/home/vmail";
    # if maildir is '/home/vmail/domain.tld/user' then '/home/vmail' is the
    # $root_path. if your maildirs are '/home/vmail/user@domain.tld' then
    # this program will need to be modified in order to work right.
    # $logfile = "/var/log/removed_maildirs.log";

    То есть если у вас пользователи хранятся в папке vmail затем домен затем пользователь то измените путь до vmail. А вот если у вас нет папки домен а сразу пользователи хранятся в vmail, то необходимо подправить скрипт для его работы. PostfixAdmin позволяет и так и так хранить пользователей. Я использовал как раз второй вариант хранения без папки домена. При запуске скрипта в дефолтовой версии он горит желанием удалить все папки которые хранятся в /home/vmail, чего бы мне не хотелось )))
    Помогите как подправить скрипт?
    По второму вопросу:

    SergeySL: С другой стороны, если тот, кого Вы не добавили в алиас, не получит важное письмо, то Вам вряд ли скажут спасибо.

    То есть участие меня подразумевает редакцию этого алиаса. Вот такой сценарий без этого скрипта: Захожу в PostfixAdmin — создать алиас — создаю everyone@domain.tld — с адресом доставки например меня. Сохраняю. В списках алиасов данного домена появляется этот алиас, захожу в редактирование и на каждой строчке забиваю всех пользователей которым необходимо получать письма. При просмотре базы через PhpMyAdmin, видим что в таблице алиас на простив everyone в поле кому через запятую появились адреса которым нужно напрвить копии. Также через редактирование алиаса можно править список получателей. Данная схема работает и в пользовательском интерфейса PostfixAdmin. Я не стал запускать скрипт mkeveryone.pl рассылка и администрирование и так работает. Хотел разобраться зачем этот скрипт всё таки нужен. Вот.
    Я вот подумал чуть ))) получается данный скрипт служит для рассылки всем кроме исключённых. Но тогда если добавляется новый пользователь можно его и в рассылку включить сразу тем кто будет добавлять, и рассылку по отделам сделать разную в зависимость от отдела…

    • Предыдущий вопрос задан мной не верно. Вот что есть в файле

      # settings:
      # $root_path = "/home/vmail";
      # if maildir is '/home/vmail/domain.tld/user' then '/home/vmail' is the
      # $root_path. if your maildirs are '/home/vmail/user@domain.tld' then
      # this program will need to be modified in order to work right.
      # $logfile = "/var/log/removed_maildirs.log";

      То есть если у вас пользователи хранятся в папке vmail затем домен затем пользователь то измените путь до vmail. А вот если у вас нет папки домен а сразу пользователи хранятся в vmail, то необходимо подправить скрипт для его работы. PostfixAdmin позволяет и так и так хранить пользователей. Я использовал как раз второй вариант хранения без папки домена. При запуске скрипта в дефолтовой версии он горит желанием удалить все папки которые хранятся в /home/vmail, чего бы мне не хотелось )))
      Помогите как подправить скрипт?

      Прошу прощение за невнимательность. Не заметил «this program will need to be modified in order to work right». Не могу помочь, т.к. не знаю Perl. Хотя на Вашем месте я бы перенастроил почтовую систему. Что будет, если доменов станет несколько? 😉

      Я вот подумал чуть ))) получается данный скрипт служит для рассылки всем кроме исключённых. Но тогда если добавляется новый пользователь можно его и в рассылку включить сразу тем кто будет добавлять, и рассылку по отделам сделать разную в зависимость от отдела…

      Можно все делать руками. +1 операция при добавлении ящика +1 операция при удалении. Естественно, конца света не будет, но зачем делать то, что можно не делать? 😉 С рассылкой по отделам все сложнее. Нужен признак принадлежности пользователя к отделу, которого нет по умолчанию. Еще раз повторю, что все зависит от количества абонентов. Если их очень много, лучше подправить внутренности PostfixAdmin, если мало — не заморачиваться 🙄

      P.S.: Используйте теги при оформлении комментариев. В случае аккуратного оформления читать гораздо удобнее 😉


    • #!/usr/bin/perl -w
      ################################################################################
      #
      # cleanupdirs 1.2 by jared bell and BALU 23/06/2009
      #
      # display/remove maildir & domains directory tree's not listed in the postfix
      # mysql database. currently setup for use with postfixadmin, but can be
      # adapted. edit settings where it says 'change settings as needed.' by default
      # this program will display a list of directories which need deleted, nothing
      # is actually deleted. to change this behavior, look into the command line
      # arguments.
      #
      # command line arguments:
      # --delete
      # force automatic deletion of directories. instead of displaying a list
      # of deleted directories, they will be logged in the specified logfile.
      # --print
      # display deleted directories as well as log them. only valid when
      # '--delete' has been specified.
      #
      # settings:
      # $root_path = "/home/vmail";
      # if maildir is '/home/vmail/domain.tld/user' then '/home/vmail' is the
      # $root_path. if your maildirs are '/home/vmail/user@domain.tld' then
      # this program will need to be modified in order to work right.
      # $logfile = "/var/log/removed_maildirs.log";
      # the logfile to use when $delete_old_dirs is set to 1
      # $db_* = "*";
      # sets the host, port, database, user and pass to your mysql server
      #
      # version history:
      # 1.2 - removed uneeded settings. added '--print' command line argument
      # 1.1 - added '--delete' command line argument
      # 1.0 - initial release
      #
      ################################################################################
      use strict;
      use DBI;
      use File::Path;
      use Getopt::Long;
      ### change settings as needed, see notes above #################################
      my $root_path = "/home/vmail";
      my $logfile = "/var/log/removed_maildirs.log";
      my $db_hostname = "localhost";
      my $db_port = "3306";
      my $db_database = "postfix";
      my $db_username = "someuser";
      my $db_password = "somepass";
      ### begin program ##############################################################
      my(@dirs_to_delete, $logfile_open);
      my $delete_old_dirs = 0; # do not delete by default, use cmdline to change this
      my $print_also = 0; # also print items when deleting, use cmdline to change this
      GetOptions ('delete' => \$delete_old_dirs, 'print' => \$print_also);
      my $conn_info = "DBI:mysql:database=$db_database;hostname=$db_hostname;port=$db_port";
      my $dbh = DBI->connect($conn_info, $db_username, $db_password)
      or die $DBI::errstr;
      opendir USERDIR, $root_path
      or die "Unable to access directory '$root_path' ($!)";
      foreach my $user_dir (sort readdir USERDIR) {
      next if $user_dir =~ /^\./; # skip dotted dirs
      push @dirs_to_delete, "$root_path/$user_dir"
      if &check_dir("SELECT maildir FROM mailbox WHERE maildir = ?",
      "$user_dir/"); # end slash needed for checkdir
      }
      closedir USERDIR;
      $dbh->disconnect;
      if (@dirs_to_delete) {
      foreach my $to_delete (@dirs_to_delete) {
      if ($delete_old_dirs == 1) {
      $logfile_open = open LOGFILE, ">> $logfile"
      or die "Unable to append logfile '$logfile' ($!)"
      unless $logfile_open;
      rmtree $to_delete;
      print LOGFILE localtime() . " Deleting directory '$to_delete'\n";
      print localtime() . " Deleting directory '$to_delete'\n"
      if $print_also;
      } else {
      print localtime() . " Need to delete directory '$to_delete'\n";
      }
      }
      }
      close LOGFILE if $logfile_open;
      sub check_dir {
      my($query, $dir) = @_;
      my $sth = $dbh->prepare($query);
      my $num_rows = $sth->execute($dir);
      $sth->finish;
      ($num_rows eq "0E0") ? 1 : 0;
      }

  4. Проблема с настройкой vacation. После отправки письма получаю ответ:

    (expanded from
    ): Command died with status 2:
    "/var/spool/vacation/vacation.pl". Command output: Can't locate
    MIME/EncWords.pm in @INC (@INC contains: /usr/local/lib/perl5/5.8.9/BSDPAN
    /usr/local/lib/perl5/site_perl/5.8.9/mach
    /usr/local/lib/perl5/site_perl/5.8.9 /usr/local/lib/perl5/5.8.9/mach
    /usr/local/lib/perl5/5.8.9 .) at /var/spool/vacation/vacation.pl line 99.
    BEGIN failed--compilation aborted at /var/spool/vacation/vacation.pl line
    99.

    так понять проблемма с MIME::EncWords модулем перл, пробовал установить — не получается, ошибка и не показыват почему тока *** Signal 11. Обновил порты, апдэйтил перл и модули но все так же.

    • Совсем недавно пользовался автоответчиком, все работает отлично. Perl Вы как-то интересно обновляли. Например, у меня сейчас perl -v:

      This is perl 5, version 14, subversion 2 (v5.14.2) built for amd64-freebsd

Оставить комментарий