Назад | Перейти на главную страницу

Используйте procmail для доставки на стандартный вывод и второй сервер

Я хотел бы, чтобы сервер Postfix доставлял каждое сообщение определенному транспорту, а также ретранслировал его на второй сервер. В master.cf у меня есть транспорт:

zarafa unix - n n - 10 pipe
  flags= user=vmail argv=/usr/bin/zarafa-dagent ${user}

Поскольку я не могу заставить Postfix доставить два транспорта, мне, вероятно, понадобится транспорт-оболочка, возможно, с использованием procmail, который доставляет на zarafa-dagent и ретранслирует на второй сервер (а не только вперед по адресу; реле ко второму серверу).

Это также может быть сценарий, вызывающий sendmail или что-то еще, но в настоящий момент я не знаю, как действовать дальше.

такие вещи, как bcc_maps, не работают, потому что тогда он не создает соответствующих заголовков X-Original-To и Delivered-To. Он должен быть отправлен тому же получателю на сервере, на который он передается, что и исходный сервер.

Изменить: возможно, мне следует кое-что уточнить: на резервной машине у меня не может быть тех же почтовых ящиков, что и на основном; есть только одна коробка. Если бы у меня были все почтовые ящики, можно было бы отправить BCC на этот сервер. Но поскольку на первичном сервере электронная почта доставляется с использованием специального транспорта zarafa, я не могу сообщить вторичному серверу, какие почтовые ящики там есть. Следовательно, я хотел выполнить ретрансляцию на этот сервер, и этот сервер также считает себя локальным для рассматриваемого домена. Таким образом, заголовок Delivered-To сообщал мне, каким был исходный RCTP.

Мне нужно было сделать что-то подобное, и по вашему вопросу действительно кажется, что postfix не допускает более одной доставки за раз.
Способ, которым мне удалось решить мою проблему, - это использовать небольшую оболочку, чтобы перехватить запрос, а затем запустить необходимые отправления.
Единственная проблема в том, что postfix скажет «Хорошо, доставлено!», Но на самом деле он не знает, была ли доставка успешной или нет.
Во всяком случае, это код моей обертки:

#!/bin/bash
USER=`echo $2 | awk -F"@" '{print $1}'`
NEXTHOP=`echo $2 | awk -F"@" '{print $2}'`
/usr/bin/sudo -u vmail /usr/bin/procmail -t -m USER=$USER NEXTHOP=$NEXTHOP /etc/procmailrc

«USER» - это имя пользователя, содержащееся в электронном письме, «NEXTHOP» - это домен, содержащийся в электронном письме ... для ясности: USER @ NEXTHOP.

Затем сообщение будет передано в сценарий как стандартный ввод, что позволит вам получить его и использовать по своему усмотрению.

Надеюсь, он будет вам полезен :)

С помощью эта страница, Я думаю, что я почти готов, но еще нет. Я пока не знаю, как ретранслировать на второй сервер из bash.

Сделал транспорт в master.cf:

filtertest    unix  -       n       n       -       10      pipe
    flags=Rq user=filter null_sender=
    argv=/usr/local/bin/filter-test.sh -f ${sender} -- ${recipient}

Я включил опцию content_filter в транспорт smtp (добавлю ее и в smtps, когда она заработает):

smtp      inet  n       -       -       -       -       smtpd
    -o content_filter=filtertest:dummy

У меня есть сценарий filtertest:

#!/bin/bash

# Simple shell-based filter. It is meant to be invoked as follows:
#       /path/to/script -f sender recipients...

# Localize these. The -G option does nothing before Postfix 2.3.
INSPECT_DIR=/var/spool/filter
SENDMAIL="/usr/sbin/sendmail -G -i" # NEVER NEVER NEVER use "-t" here.

# Exit codes from <sysexits.h>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69

# Clean up when done or when aborting.
trap "rm -f in.$$" 0 1 2 3 15

# Start processing.
cd $INSPECT_DIR || {
    echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }

cat >in.$$ || {
    echo Cannot save mail to file; exit $EX_TEMPFAIL; }

# Relay message to backup server
#TODO: how?

$SENDMAIL "$@" <in.$$

exit $?

Остается только одно: как мне сделать этот сценарий bash реле (не пересылать) содержимое файла tmp на второй сервер?

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