LINUX.ORG.RU
ФорумAdmin

Postfix. Как он передает параметры в LDA (mailbox_command)?


0

0

Очередной привет.
Помогите, а то голова кругом.
Есть postfix и dovecot. Postix настроен принимать локально почту на $mydomain, соответственно, для ее растасовки по ящикам postfix вызывает команду, написанную в параметре mailbox_command. С давкотом это должен быть давкотовский deliver:

main.cf:
mydestination = $myhostname, localhost.$mydomain, $mydomain
mailbox_command = /usr/lib/dovecot/deliver

Это работает. Более того, если я хочу сделать свой скрипт доставки, я это тоже могу сделать, например:

main.cf:
mailbox_command = /usr/local/lib/me/mydeliver

mydeliver:
#!/bin/sh
echo $ORIGINAL_RECIPIENT >>/home/me/mylog
/usr/lib/dovecot/deliver

Эхо тут в качестве примера, смысл в том, что скрипт что-то делает, а потом вызывает deliver. Это тоже работает. Потом мне локальной доставки показалось мало, и я начал мудрить с виртуальной. Сделал как в давкотовской вики, т.е.

main.cf:
mydestination = $myhostname, localhost.$myhostname
virtual_mailbox_domains = $mydomain
virtual_transport = dovecot

master.cf:
dovecot unix - n n - - pipe
flags=q user=vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${user}@${nexthop}

После чего deliver начал валиться в кору (segmentation fault). Для выяснения что с ним, собственно, случилось, я хотел вызвать его сам из своего скрипта, снабдив нужными переменными. К примеру так:

testdeliver:
#!/bin/sh
export CLIENT_ADDRESS=127.0.0.1
export CLIENT_HELO=mycomp
export RECIPIENT=user@domain.local
...
/usr/lib/dovecot/deliver </home/me/emailmessage

И получил большой жырный болт. Deliver все время говорит, что не указан параметр -d <recipient>. Но, во-первых, если ему этот параметр указать, он валится в кору. Но с корой более-менее понятно: я взял другую сборку и там он уже не падает, а по-человечески пишет, что не может подключиться к dovecot-auth, это уже ясно куда копать. А во-вторых, и это для меня сейчас наиболее интересно: postfix не передает никаких параметров, когда вызывает этот deliver. И, тем не менее, он отрабатывает нормально. Вопрос: КАК он его вызывает, или как передает параметры для этого? Я уже пробовал так: сделал mailbox_command=/usr/local/lib/me/vardeliver, в котором set >/home/me/delivervars, и абсолютно все переменные из получившегося файла экспортировал как написано выше перед вызовом /usr/lib/dovecot/deliver, и всё равно он упорно требует параметр -d. Что ж ему ещё, гаду, нужно?

1) Не указан дистрибутив
2) Не указаны версии программ и метод установки (штатные, где-то скачанные, вручную скомпилированные )
3) На сайте dovecot есть страничка, посвященная отлову ошибок и дебагу. Довольно внятная, насколько я помню.


P.S. Корка - это совсем плохо, проблема скорее всего в самой версии/сборки dovecot.

Valmont ★★★
()
Ответ на: комментарий от Valmont

1) Дистрибутив OpenSUSE 11.1 2) Postfix штатный 2.5.5-6.7; Dovecot, который не валится в кору - штатный 1.1.7, который валится - 1.2.5 собранный из последних исходников методом configure --with-pam; make; make install. 3) Да я его отлажу в конце-концов, не в этом вопрос. Мне интересно, какие есть методы передачи информации между программами. Почему postfix запускает deliver без параметров и тот раскладывает почту, а если его я запускаю из скрипта - и он требует параметр -d и ничего не раскладывает?

PS: скажите, а какие бинарники (RPM) подходят к этой системе (OpenSUSE)? На сайте Dovecot лежат RPM для RedHat 4,5 и Fedora 10,11. Можно качать и ставить или не пойдет?

shamus24
() автор топика
Ответ на: комментарий от shamus24

Я как-то запускал deliver вручную и из с.крипта - все нормально было Он просто запускается и с параметром -d и на stdin требует самого письма. Сейчас весь топик не удобно перечитывать, но там соответственно должно быть примерно так: cat xxx.msg | deliver -d xx@xx ....
rpm лучше пересобрать из модифицированно спека, по которому пакет собран в _самой_ opensuse такой же версии, что бы не было конфликтв по библиотекам, путям и прочая. Чужие пакеты не стоит.

Valmont ★★★
()

Кстати, вы не правы. Параметр -d нужен и возможно, что postfix и без его явного указания по умолчанию его передает. Вы же специальной отладкой этого процесса не занимались и не фттачили процессы всякими strace, для того, чтобы убедиться в обратном.

И тем не менее, у меня на одном их хостов, где уже года три работает связка postfix+dovecot явным образом задано:

dovecot unix - n n - 3 pipe
flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -d ${recipient}

И все работает.

Valmont ★★★
()
Ответ на: комментарий от Valmont

>dovecot unix - n n - 3 pipe

>flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -d ${recipient}

Теперь оно и у меня заработало, как только с аутентификацией разобрался. Но всё-таки - это virtual. А я изначально говорил про local. Да, цеплянием через отладчики я не занимался, но я подставлял свой скрипт! И делал в нём echo $@ >tmpfile и смотрел. Пусто там, нет никаких параметров. Более того, я в этом же скрипте делал "/usr/lib/dovecot/deliver" тут уж точно 100% без параметров. И работало же. Но только если этот скрипт запускает postfix. А если я ручками - не работает. Сейчас ещё раз проверю, а то я уже сам себе доверять перестал. Насчет stdin-а, из которого читается тело письма я в курсе, конечно, но он и не думает ничего читать, требует параметр.

shamus24
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.