Тема: Меняем в Postfix'е virtual на maildrop

Предыстория
Есть почтовый сервер, пользователи в mysql, postfix общается с mysql'ом через sasl2. В роле Pop/imap сервера courier-imap который в свою очередь использует courier-authdaemon -> authmysql
Есть SpanAssasin который помечает письма и кидает в спец. ящик, где они лежат 7 дней, после чего скриптом убиваются. И есть груповые рассылки.

Нужно
раскидать определенные spamassasin'ом письма по imap папкам inbox.spam и рассылки по inbox.massmail. Плюс сделать нормальное уведомление о заканчивающимся месте и автоответчик.

Решение
Есть procmail и maildrop. Поскольку о первом я вообще ничего не знаю выбрал второй. У maildrop'а очень большие возможности по внедрению своих скриптов и правил.

Ход работы
Оговорюсь, все работает хорошо, тоесть проблем с почтой вообще нет. Просто нехватает функциональности. Поэтому радикально менять ничего нехочу.

Теоретичиски все просто, надо заменить virtual ралай на maildrop, в свою очередь maildrop умеет заглядывать в конфиги authmysqlrc или использовать свой, тоесть теоретичиски со стороны postfix'а и main.cf особо переделывать ненужно.

Собираем maildrop из портов /usr/ports/mail/maildrop
make WITH_AUTHLIB=yes MAILDROP_TRUSTED_USERS=courier
и выбирает авторизацию в mysql

Из мануала постфикса вычитал, что для виртуальных доменов нужно:

1. добавить virtual_transport = maildrop, после чего виртуал сам перекинит все письма maildrop'у
2. включить maildrop maildrop_destination_recipient_limit = 1
3. немного подправить master.cf

maildrop        unix    -       n       n       -       -       pipe
  flags=DRhu user=courier argv=/usr/local/bin/maildrop -w 90 -d ${recipient}

Дальше про настройку maildrop'a пока можно забыть так как проблема вылезла уже на этой стадии, какбы все, но вот что интересно, письма попрежнему отправляются от virtual

postfix/virtual[81641]: AA9652841B: to=...

хотя судя по мануалам должно быть

postfix/maildrop

Какие есть идеи??? В логах ничего про маилдроп не пишется... все отправляется как и попрежнему.

p.s
postfix перегружал

2

Re: Меняем в Postfix'е virtual на maildrop

Отбой, сам дурак smile забыл что у меня virtual в базе прописан... Сделал, maildrop работает на ура!

3

Re: Меняем в Postfix'е virtual на maildrop

А вторым этапом после тестирования системы прикручу это http://en.wikipedia.org/wiki/Sieve_(mai … _language)

https://img147.imageshack.us/img147/7448/mailfilteringlanguageik6.th.jpg

4

Re: Меняем в Postfix'е virtual на maildrop

а потмо статейку)). Хотя smtp-авторизация так и не зработала у меня.

5

Re: Меняем в Postfix'е virtual на maildrop

Статейку я из комерческих соображений не пишу... мы с Александром не одну неделю с почтовиком провоевали... Я кстати теперь их успешно внедряю в фирмочки и обслуживаю... отказоустойчивость и дуракоупорность поразительная smile Если FS не навернётся то работает долго и стабильно.

Уже реализовал разделение сервера на кластеры, тоесть база и антивирус на одном сервере, спамасистент с фильтрами на другом, а письма и поп/имап сервер на третим... Сейчас работаю над фильтами про которые говорил выше и обшей адресной книгой в ldap'е, пользователей тоже думаю в ldap перенести, но тогда надо веб-морду для управления нормальную делать...

Если с смтп проблема то пиши в аську, сделаем...

6

Re: Меняем в Postfix'е virtual на maildrop

Статью конечно можно, но кратенько и простенько.
Кстати Алан, Игорюху я помню тоже задолбал было с вопросами "А почему" и "Для чего" smile)
Так что доля правды на его стороне smile В частности у меня был ступор по поводу virtual директорий. Воевал помню с неделю.

Те статьи что я в инете видел, они уже устарели. Новые никто не пишет, только потому что сейчас ПО обновляется с бешенными темпами и успеть за всем нет просто сил. А тем более сидеть и катать статьи. Я беру к примеру старую статью и по мере поступления проблем, пытаюсь их решить. Если не получается, тормошу нашего crash-a smile) Так и живем.

7

Re: Меняем в Postfix'е virtual на maildrop

Чтото времени все небыло написать продолжение...

Как оказалось чтобы использовать Sieve надо отказатся от courier и перейти на cyrus. Что я и сделаю при настройки следующего сервака. А пока вот пример небольшого скриптика, который помогает раскидывать письма по директориям и считать квоту.

при прохождунии письма через maildrop существуют следующие переменные:

#$DEFAULT       domain.com/test/        # maildir пользователя
#$HOME          /user/mail/virtual/     # путь до всех maildir'ов
#$LOCKEXT       .lock
#$LOCKSLEEP     5
#$LOCKTIMEOUT   60
#$LOCKREFRESH   15
#$LOGNAME       [email protected]         # mail адрес пользователя
#$PATH          /bin:/usr/bin:/usr/local/bin
#$SENDMAIL      /usr/sbin/sendmail -oi
#$SHELL         /bin/sh
#$MAILDIRQUOTA  10240000             # квота

Переменные - это так, для общего развития, в документации я этого не нашел... Cущественное различие в том, что maildrop неумеет создавать директории, тоесть если вы добавили пользователя (и у вас procmail), то при отправки письма пользователю все нужные директории будут созданы, а при использоватнии maildrop'а будет ошибка. Поэтому в начала скрипта я добавил проверку на наличие директорий.

# Index
`test -d $HOME$DEFAULT`
if ($RETURNCODE!=0)
{
    `/usr/local/bin/maildirmake $HOME$DEFAULT`
    `echo "INBOX" >> $HOME$DEFAULT/courierimapsubscribed`
}
# .Drafts
`test -d $HOME$DEFAULT/.Drafts`
if ($RETURNCODE!=0)
{
    `/usr/local/bin/maildirmake $HOME$DEFAULT/.Drafts`
    `echo "INBOX.Drafts" >> $HOME$DEFAULT/courierimapsubscribed`
}
# .Sent
`test -d $HOME$DEFAULT/.Sent`
if ($RETURNCODE!=0)
{
    `/usr/local/bin/maildirmake $HOME$DEFAULT/.Sent`
    `echo "INBOX.Sent" >> $HOME$DEFAULT/courierimapsubscribed`
}
# .Spam
`test -d $HOME$DEFAULT/.Spam`
if ($RETURNCODE!=0)
{
    `/usr/local/bin/maildirmake $HOME$DEFAULT/.Spam`
    `echo "INBOX.Spam" >> $HOME$DEFAULT/courierimapsubscribed`
}
# .Trash
`test -d $HOME$DEFAULT/.Trash`
if ($RETURNCODE!=0)
{
    `/usr/local/bin/maildirmake $HOME$DEFAULT/.Trash`
    `echo "INBOX.Trash" >> $HOME$DEFAULT/courierimapsubscribed`
}

Ко всему этому, постфикс, по умолчанию, при привышении квоты, просто перестает доставлять письма, не извещая пользователя, это не есть гууд. Для того чтобы этого небыло я спользоую дополнительную проверку с помощтю maildirmake -q

`/usr/local/bin/maildirmake -q $MAILDIRQUOTA'S' $HOME$DEFAULT`

при прохлждении этого правила смотрится файл /usr/local/etc/quotawarnmsg в котором у меня

cmm# less quotawarnmsg
From: Mail Delivery System <>
Reply-To: <>
Subject: Mail quota warning
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 7bit
______________________________________________________________________________
Your mailbox on the server is now more than 90% full. So that you can continue
to receive mail you need to remove some messages from your mailbox.
______________________________________________________________________________
My Mail Server

Теперь пользователь будет извещен. Файлик будет создан, даже если у пользователя больше нет метса, так как создается он напрямую в maildir'е пользователя.

Теперь, можно смело доставлять письма в директории пользователей. Начнем с того, для чего все это делалось, с раскидывания писем помеченых как спам по папкам .Spam. За это у нас отвечает несколько строк

if (/^X-Spam-Flag: YES/)
{
    to "$HOME$DEFAULT/.Spam"
}

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

а завершает скрипт одна строка, говорящая что если ничего не сделали, то положить куда положено wink

to "$HOME$DEFAULT"

P.S.
Можно и пользовательский фильтры использовать. Правдо формат у них должен быть maildrop'овский, а он жутко неудобный, поутому следующим этапом пробуем Sieve

`test -f  $HOME$DEFAULT/.mailfilter`
if ($RETURNCODE!=1)
{
    include "$HOME$DEFAULT/.mailfilter"
}

можно так а можно создавать диреторию .mailfilters, оттуда конфиги буду братся в формате user@domain (переменная $LOGNAME). Подробнее тут http://sourceforge.net/projects/mdropspammailfilter Но мне не понравилось.

8

Re: Меняем в Postfix'е virtual на maildrop

По постфигсу читаю щас книженцию "The Book of Postfix" http://www.postfix-book.com

https://img185.imageshack.us/img185/4459/bookpostfixmk4.th.jpg

Рекомендую к прочтению, но книга написана не длоя начинающего, думаю если вы еще не работали с постфиксом то тут слишком мало примеров. Этв книга для того чтобы понять процессы и связи в postfix'e

Table of Contents
Chapter 1: An Introduction to Postfix
Chapter 2: Preparing Your Host and Environment
Before installing Postfix, you should always verify that your server host can handle an SMTP server. Preparations shows you how to configure the operating system so that you can get to most out of Postfix.

Chapter 3: Mail Server for a Single Domain
The first step in any new Postfix installation is to create a configuration that can receive mail for a single domain. In Mail Server for a single Domain, you will see how to verify that the system works and create a basis for more complicated setups.

Chapter 4:Dial-Up Mail Server for a Singe Domain
You don't need to significantly modify the single-domain setup to get a working dialup configuration. Dial-Up Mail Server shows you these small but important changes so that you .

Chapter 5: Anatomy of Postfix
Wietse Venema says that Postfix is actually a router, one that routes messages instead of IP packets. In Postfix Anatomy, you'll get the big picture of how the Postfix innards interact.

Chapter 6: A Postmaster's Primer to Email
Chapter 7: Understanding Restrictions
Restrictions control SMTP communication. Understanding Restrictions explains how restrictions work.

Chapter 8: Restrictions
Restrictions shows you how to put them to practical use on your system.

Chapter 9: Understanding Checks
Checks do their work based on message content. Understanding *_checks explains how checks work.

Chapter 10: Checks
Checks shows you real-life examples.

Chapter 11: Understanding Filters
Filters delegate SMTP communication management and content control to external applications. This might be necessary if a certain task clearly lies beyond the duties on the MTA (virus filtering is one example). As with restrictions and checks, the discussion of filters breaks down into two chapters: Understanding Filters for a discussion of how filters work.

Chapter 12: Filters
Filters gives you something that you can actually get your hands on.

Chapter 13: Mail Relays
Mail relays transport messages on behalf of other mail servers or clients. In most cases, mail relays are exposed to the Internet, while the other servers sit safely behind a firewall. In addition, you'll see how to make a smart host out of a simple mail relay.

Chapter 14: A Mail Server for Multiple Domains
This chapter describes the two ways that Postfix can handle mail for multiple domains. In addition, you will see how to configure Postfix to query an SQL server instead of looking at static maps.

Chapter 15: SMTP Authentication Primer
SMTP authentication is a system for authenticating mail clients before they relay messages. Because SMTP authentication in Postfix relies on the Cyrus SASL software, Understanding SMTP Authentication shows you how to configure Cyrus SASL before you can use it with Postfix.

Chapter 16: SMTP Authentication
Continuing the discussion of SMTP authentication, Simple Authentication and Security Layer shows you how to configure Postfix for server- and/or client-side authentication.

Chapter 17: Understanding Transport Layer Security
Transport Layer Security (TLS) encrypts the communication layer between Postfix and other hosts. The Postfix implementation of Transport Layer Security requires OpenSSL, so Understanding Transport Layer Security not only shows you how TLS works, but also how to prepare the required certificates.

Chapter 18: Transport Layer Security
This chapter shows you how to set up the Postfix server to offer encryption to other hosts and how to make the Postfix client use it when other servers offer TLS. You will also see how certificate-based relaying works.

Chapter 19: A Company Mail Server
This chapter explains how to configure Postfix to query an LDAP server. In doing so, you will delegate the job of local delivery to an MDA (message delivery agent) and configure a basic Courier IMAP server. In the end, you will have a complete mail system that gets user data from an OpenLDAP server.

Chapter 20: Running Postfix in a chroot Environment
Chrooting Postfix adds another barrier against intrusion. This chapter will tell you how to do that and will give you tipps how you can bring in other applications Postfix might need into the jail too.

Chapter 21: Rate Limiting
Postfix 2.2 and 2.1 snapshots include a new feature for limiting the rate of client connections. Rate limiting is a countertactic for protecting Postfix from SMTP clients that inundate the smtpd daemon with too many connections at once. This chapter illustrates several instances where rate limiting is useful and shows you how to configure it.

Chapter 22: Performance Tuning
Postfix is fast out of the box, but like other packages, you can usually tune it to work even faster. Furthermore, there are situtations where Postfix may not perform as well you expected, whether it is due to hardware or software limitations on the server system or other adverse conditions such as a big influx of spam or undeliverable mail.

This chapter shows you how to find and analyze the most common performance problems.

Appendix A: Installation
Installation contains installation instructions from source code as well as for the Debian and RedHat Linux distributions.

Appendix B: Troubleshooting Postfix
Having trouble with something when you try to modify a configuration? Troubleshooting Postfix gives you some advice for the most frequent gotchas, and gives some general tips for tracking down problems.

Appendix C: CIDR and SMTP Standards Reference
Not everyone can memorize subnets in CIDR notation and SMTP server response codes. We've put them together for you in CIDR notation and response codes.

Glossary
If there's some weird technical term that you don't know, check the Glossary.

9

Re: Меняем в Postfix'е virtual на maildrop

она у тебя не в электронном виде?

10

Re: Меняем в Postfix'е virtual на maildrop

Неа, я в электронном много читать нелюблю, но можно поискать... завтро гляну

11

Re: Меняем в Postfix'е virtual на maildrop

впринципе я попробовал заказать, посмотрим что выйдет)

12

Re: Меняем в Postfix'е virtual на maildrop

О! Про sieve на dovecot запамятовал... Почему dovecot? Это гибрид Cyrus и Courier + много полезных функций. Все приводить не буду, только ту часть как присоединить sieve и как его пользовать

mail# cat dovecot.conf
protocols = imap pop3 imaps pop3s managesieve
...
mail_location = maildir:/mail/virtual/%d/%n
...
protocol lda {
...
    mail_plugins = quota sieve
...
}
auth_username_format = %n@%d
...
plugin {
    quota = maildir
    sieve_before = /usr/local/etc/dovecot/sieve_global/
}

Тут /usr/local/etc/dovecot/sieve_global/ глобальное правило для всех клиентов, оно может быть перезаписано индивидуально самим пользователем

mail# ls -la /usr/local/etc/dovecot/sieve_global/
total 8
drwxr-xr-x  2 virtual  wheel  512 Apr 26  2010 .
drwxr-xr-x  3 root     wheel  512 Apr 26  2010 ..
-rw-r--r--  1 root     wheel  130 Apr 26  2010 mv-spam.sieve
-rw-r--r--  1 virtual  wheel  152 Apr 26  2010 mv-spam.svbin
mail# cat /usr/local/etc/dovecot/sieve_global/mv-spam.sieve 
require ["fileinto","imap4flags"];
if header :contains "X-Spam-Status" "Yes"
{
fileinto :flags ["$Junk"]   "INBOX.Spam";
stop;
}

svbin - бинарный формат, его делает команда "sievec". Собственно говоря все. Осталось найти клиент который будит редактировать правила для самих пользователей, это делается по специальному протоколу с авторизацией от постового ящика. У меня это модуль для SquirrelMail, так же понимает Thunderbird, Horde, Roundcube...

Правило которое создается пользователем выглядит так и находится в его почтовом каталоге

mail# pwd
/mail/virtual/domain.lt/userl/sieve
mail# ls -la 
total 10
drwx------   3 virtual  mail   512 Apr 23  2013 .
drwx------  13 virtual  mail  1024 Nov  7 23:28 ..
-rw-------   1 virtual  mail  2071 Apr 23  2013 phpscript.sieve
drwx------   2 virtual  mail   512 Apr 23  2013 tmp
mail# cat phpscript.sieve 
# This script has been automatically generated by avelsieve
# (Sieve Mail Filters Plugin for Squirrelmail)
# Warning: If you edit this manually, then the changes will not 
# be reflected in the users' front-end!
require ["fileinto","envelope","reject","vacation","imap4flags","relational","comparator-i;ascii-numeric","regex","body","date"];
if header :contains "Subject" "security run output"
{
fileinto :flags ["Deleted"]   "INBOX.Trash";
stop;
}
if header :contains "Subject" "Bacula: Backup OK of"
{
fileinto :flags ["Deleted"]   "INBOX.Trash";
stop;
}
if true
{
redirect "[email protected]";
}