Используйте 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.
3 ответа
Мне нужно было сделать нечто подобное, и по вашему вопросу действительно кажется, что 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.
Затем сообщение будет передано в сценарий как stdin, что позволит вам получить его и использовать по своему усмотрению.
Я просто надеюсь, что это будет полезно для вас:)
С помощью этой страницы, я думаю, я почти там, но пока нет. Я не знаю, как перейти на второй сервер, из 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 на второй сервер?
Вы можете попробовать использовать Roundhouse или установить MIMEDefang и использовать add_recipient для пересылки электронных писем на любой другой сервер, который вы хотите.