Я хотел бы, чтобы сервер 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 и использовать добавить получателя для пересылки писем на любой другой сервер.