Postfix настройка · 8 min read · Dec 26, 2025

Виртуальные пользователи и домены с Postfix, Courier, MySQL и SquirrelMail (Fedora 14 x86_64) - Страница 5

13 Установка Razor, Pyzor и DCC и настройка SpamAssassin

Razor, Pyzor и DCC — это спам-фильтры, которые используют сеть совместной фильтрации. Чтобы установить Razor и Pyzor, выполните

yum install perl-Razor-Agent pyzor

Затем инициализируйте оба сервиса:

chmod -R a+rX /usr/share/doc/pyzor-0.5.0 /usr/bin/pyzor /usr/bin/pyzord  
chmod -R a+rX /usr/lib/python2.7/site-packages/pyzor  
su -m amavis -c 'pyzor --homedir /var/spool/amavisd discover'  
su -m amavis -c 'razor-admin -home=/var/spool/amavisd -create'  
su -m amavis -c 'razor-admin -home=/var/spool/amavisd -register'

Затем мы устанавливаем DCC следующим образом:

cd /tmp  
wget http://www.dcc-servers.net/dcc/source/dcc-dccproc.tar.Z  
tar xzvf dcc-dccproc.tar.Z  
cd dcc-dccproc-1.3.134  
./configure --with-uid=amavis  
make  
make install  
chown -R amavis:amavis /var/dcc  
ln -s /var/dcc/libexec/dccifd /usr/local/bin/dccifd

Теперь мы должны сказать SpamAssassin использовать эти три программы. Отредактируйте /etc/mail/spamassassin/local.cf так, чтобы он выглядел следующим образом:

vi /etc/mail/spamassassin/local.cf

| # Эти значения могут быть переопределены редактированием ~/.spamassassin/user_prefs.cf # (см. spamassassin(1) для подробностей) # Это должны быть безопасные предположения и позволять простую визуальную фильтрацию # без риска потери электронных писем. #required_hits 5 #report_safe 0 #rewrite_header Subject [SPAM] # dcc use_dcc 1 dcc_path /usr/local/bin/dccproc #pyzor use_pyzor 1 pyzor_path /usr/bin/pyzor #razor use_razor2 1 razor_config /var/spool/amavisd/razor-agent.conf #bayes use_bayes 1 use_bayes_rules 1 bayes_auto_learn 1 |

Затем мы должны включить плагин DCC в SpamAssassin. Откройте /etc/mail/spamassassin/v310.pre и раскомментируйте строку loadplugin Mail::SpamAssassin::Plugin::DCC:

vi /etc/mail/spamassassin/v310.pre

| [...] # DCC - выполнять проверки сообщений DCC. # # DCC отключен здесь, потому что он не является открытым исходным кодом. См. лицензию DCC # для получения дополнительной информации. # loadplugin Mail::SpamAssassin::Plugin::DCC [...] |

Вы можете проверить конфигурацию SpamAssassin, выполнив:

spamassassin --lint

Не должно быть никаких ошибок.

Запустите

/etc/init.d/amavisd restart

после этого.

Теперь мы обновляем наши правила SpamAssassin следующим образом:

sa-update --no-gpg

Мы создаем задачу cron, чтобы правила обновлялись регулярно. Выполните

crontab -e

чтобы открыть редактор задач cron. Создайте следующую задачу cron:

| 23 4 */2 * * /usr/bin/sa-update --no-gpg &> /dev/null |

Это будет обновлять правила каждые два дня в 4:23.

14 Уведомления о превышении квоты

Если вы хотите получать уведомления обо всех учетных записях электронной почты, которые превышают квоту, создайте файл /usr/local/sbin/quota_notify:

cd /usr/local/sbin/  
vi quota_notify

| #!/usr/bin/perl -w # Автор <[email protected]> # # Этот скрипт предполагает, что virtual_mailbox_base определен # в файле main.cf postfix. Этот каталог предполагается как содержащий # каталоги, которые сами содержат почтовые директории ваших виртуальных пользователей. # Например: # # -----------/ # | # | # home/vmail/domains/ # | | # | | # example.com/ foo.com/ # | # | # ----------------- # | | | # | | | # user1/ user2/ user3/ # | # | # maildirsize # use strict; my $POSTFIX_CF = "/etc/postfix/main.cf"; my $MAILPROG = "/usr/sbin/sendmail -t"; my $WARNPERCENT = 80; my @POSTMASTERS = ('[email protected]'); my $CONAME = 'Моя компания'; my $COADDR = '[email protected]'; my $SUADDR = '[email protected]'; my $MAIL_REPORT = 1; my $MAIL_WARNING = 1; #get virtual mailbox base from postfix config open(PCF, "< $POSTFIX_CF") or die $!; my $mboxBase; while () { next unless /virtual_mailbox_base\s*=\s*(.*)\s*/; $mboxBase = $1; } close(PCF); #предполагаем один уровень подкаталогов для доменных имен my @domains; opendir(DIR, $mboxBase) or die $!; while (defined(my $name = readdir(DIR))) { next if $name =~ /^\.\.? ; #пропустить '.' и '..' next unless (-d "$mboxBase/$name"); push(@domains, $name); } closedir(DIR); #перебираем домены для файлов username/maildirsize my @users; chdir($mboxBase); foreach my $domain (@domains) { opendir(DIR, $domain) or die $!; while (defined(my $name = readdir(DIR))) { next if $name =~ /^\.\.? ; #пропустить '.' и '..' next unless (-d "$domain/$name"); push(@users, {"$name\@$domain" => "$mboxBase/$domain/$name"}); } } closedir(DIR); #get user quotas and percent used my (%lusers, $report); foreach my $href (@users) { foreach my $user (keys %$href) { my $quotafile = "$href->{$user}/maildirsize"; next unless (-f $quotafile); open(QF, "< $quotafile") or die $!; my ($firstln, $quota, $used); while () { my $line = $_; if (! $firstln) { $firstln = 1; die "Ошибка: поврежденный quotafile $quotafile" unless ($line =~ /^(\\d+)S/); $quota = $1; last if (! $quota); next; } die "Ошибка: поврежденный quotafile $quotafile" unless ($line =~ /\s*(-?\d+)/); $used += $1; } close(QF); next if (! $used); my $percent = int($used / $quota * 100); $lusers{$user} = $percent unless not $percent; } } #отправить отчет постмастерам if ($MAIL_REPORT) { open(MAIL, "| $MAILPROG"); select(MAIL); map {print "To: $_\n"} @POSTMASTERS; print "From: $COADDR\n"; print "Subject: Ежедневный отчет о квоте.\n"; print "ЕЖЕДНЕВНЫЙ ОТЧЕТ О КВОТЕ:\n\n"; print "----------------------------------------------\n"; print "| % ИСПОЛЬЗОВАНИЕ | ИМЯ УЧЕТНОЙ ЗАПИСИ |\n"; print "----------------------------------------------\n"; foreach my $luser ( sort { $lusers{$b} <=> $lusers{$a} } keys %lusers ) { printf("| %3d | %32s |\n", $lusers{$luser}, $luser); print "---------------------------------------------\n"; } print "\n--\n"; print "$CONAME\n"; close(MAIL); } #отправить предупреждение людям, превышающим квоту if ($MAIL_WARNING) { foreach my $luser (keys (%lusers)) { next unless $lusers{$luser} >= $WARNPERCENT; # пропустить тех, кто ниже квоты open(MAIL, "| $MAILPROG"); select(MAIL); print "To: $luser\n"; map {print "BCC: $_\n"} @POSTMASTERS; print "From: $SUADDR\n"; print "Subject: ПРЕДУПРЕЖДЕНИЕ: Ваша почтовая ящик заполнен на $lusers{$luser}%.\n"; print "Reply-to: $SUADDR\n"; print "Ваш почтовый ящик: $luser заполнен на $lusers{$luser}%.\n\n"; print "Как только ваш почтовый ящик превысит вашу месячную квоту хранения\n"; print "ваше ежемесячное выставление счета будет автоматически скорректировано.\n"; print "Пожалуйста, подумайте о том, чтобы удалить электронные письма и очистить папку с мусором, чтобы освободить место.\n\n"; print "Свяжитесь с <$SUADDR> для получения дополнительной помощи.\n\n"; print "Спасибо.\n\n"; print "--\n"; print "$CONAME\n"; close(MAIL); } } |

Убедитесь, что вы настроили переменные вверху (особенно адрес электронной почты [email protected]).

Мы должны сделать файл исполняемым:

chmod 755 quota_notify

Запустите

crontab -e

чтобы создать задачу cron для этого скрипта:

| 0 0 * * * /usr/local/sbin/quota_notify &> /dev/null |

15 Тестирование Postfix

Чтобы проверить, готов ли Postfix к SMTP-AUTH и TLS, выполните

telnet localhost 25

После того, как вы установили соединение с вашим почтовым сервером Postfix, введите

ehlo localhost

Если вы видите строки

*250-STARTTLS *

и

*250-AUTH* LOGIN* PLAIN** *

все в порядке.

[root@server1 sbin]# telnet localhost 25  
Trying 127.0.0.1...  
Connected to localhost.  
Escape character is '^]'.  
220 server1.example.com ESMTP Postfix  
ehlo localhost  
250-server1.example.com  
250-PIPELINING  
250-SIZE 10240000  
250-VRFY  
250-ETRN  
250-STARTTLS  
250-AUTH LOGIN PLAIN  
250-AUTH=LOGIN PLAIN  
250-ENHANCEDSTATUSCODES  
250-8BITMIME  
250 DSN  
quit  
221 2.0.0 Bye  
Connection closed by foreign host.  
[root@server1 sbin]#

Введите

quit

чтобы вернуться к оболочке системы.

16 Заполнение базы данных и тестирование

Чтобы заполнить базу данных, вы можете использовать оболочку MySQL:

mysql -u root -p
USE mail;

По крайней мере, вам нужно создать записи в таблицах domains и users:

INSERT INTO `domains` (`domain`) VALUES ('example.com');  
INSERT INTO `users` (`email`, `password`, `quota`) VALUES ('[email protected]', ENCRYPT('secret'), 10485760);

(Пожалуйста, убедитесь, что вы используете синтаксис ENCRYPT во втором операторе INSERT, чтобы зашифровать пароль!)

Если вы хотите сделать записи в других двух таблицах, это будет выглядеть так:

INSERT INTO `forwardings` (`source`, `destination`) VALUES ('[email protected]', '[email protected]');  
INSERT INTO `transport` (`domain`, `transport`) VALUES ('example.com', 'smtp:mail.example.com');

Чтобы выйти из оболочки MySQL, введите

quit;

Для большинства людей проще, если у них есть графический интерфейс для MySQL; поэтому вы также можете использовать phpMyAdmin (в этом примере по адресу http://192.168.0.100/phpMyAdmin/ или http://server1.example.com/phpMyAdmin/) для администрирования базы данных mail. Снова, когда вы создаете пользователя, убедитесь, что вы используете функцию ENCRYPT для шифрования пароля:

Я не думаю, что мне нужно объяснять таблицы доменов и пользователей дальше.

Таблица переадресации может иметь записи, такие как следующие:

sourcedestination
[email protected][email protected]Перенаправляет электронные письма для [email protected] на [email protected]
@example.com[email protected]Создает учетную запись Catch-All для [email protected]. Все электронные письма на example.com будут приходить на [email protected], за исключением тех, которые существуют в таблице пользователей (т.е. если [email protected] существует в таблице пользователей, письма на [email protected] все равно будут приходить на [email protected]).
@example.com@anotherdomain.tldЭто перенаправляет все электронные письма на example.com на того же пользователя на anotherdomain.tld. Например, письма на [email protected] будут перенаправлены на [email protected].
[email protected][email protected], [email protected]Перенаправляет электронные письма для [email protected] на два или более адресов электронной почты. Все указанные адреса электронной почты под получателем получают копию электронного письма.

Таблица транспортировки может иметь записи, такие как эти:

domaintransport
example.com:Доставляет электронные письма для example.com локально. Это как если бы эта запись вообще не существовала в этой таблице.
example.comsmtp:mail.anotherdomain.tldДоставляет все электронные письма для example.com через smtp на сервер mail.anotherdomain.com.
example.comsmtp:mail.anotherdomain.tld:2025Доставляет все электронные письма для example.com через smtp на сервер mail.anotherdomain.com, но на порту 2025, а не 25, который является стандартным портом для smtp.

| example.com | smtp:[1.2.3.4]
smtp:[1.2.3.4]:2025
smtp:[mail.anotherdomain.tld] | Квадратные скобки предотвращают Postfix от выполнения запросов к MX DNS-записи для адреса в квадратных скобках. Имеет смысл для IP-адресов. | | .example.com | smtp:mail.anotherdomain.tld | Почта для любого поддомена example.com доставляется на mail.anotherdomain.tld. | | * | smtp:mail.anotherdomain.tld | Все электронные письма доставляются на mail.anotherdomain.tld. | | [email protected] | smtp:mail.anotherdomain.tld | Электронные письма для [email protected] доставляются на mail.anotherdomain.tld. |

Смотрите

man transport

для получения дополнительных сведений.

Пожалуйста, имейте в виду, что порядок записей в таблице транспортировки важен! Записи будут следовать сверху вниз.

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

postfix reload

после того, как вы внесли изменения в таблицу транспортов.

17 Отправка приветственного электронного письма для создания Maildir

Когда вы создаете новую учетную запись электронной почты и пытаетесь получить электронные письма из нее (с помощью POP3/IMAP), вы, вероятно, получите сообщения об ошибках, говорящие о том, что Maildir не существует. Maildir создается автоматически, когда первое электронное письмо приходит для новой учетной записи. Поэтому хорошей идеей будет отправить приветственное электронное письмо на новую учетную запись.

Сначала мы устанавливаем пакет mailx:

yum install mailx

Чтобы отправить приветственное электронное письмо на [email protected], мы делаем это:

mailx [email protected]

Вам будет предложено ввести тему. Введите тему (например, Приветствие), затем нажмите ENTER, а в следующей строке введите ваше сообщение. Когда сообщение будет готово, нажмите ENTER еще раз, чтобы вы оказались на новой строке, затем нажмите CTRL+D:

[root@server1 ~]# mailx [email protected]
Subject: Welcome <– ENTER
Welcome! Have fun with your new mail account. <– ENTER
<– CTRL+D
EOT
[root@server1 ~]#

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.