使用 procmail 发送邮件到 stdout 和第二个服务器

使用 procmail 发送邮件到 stdout 和第二个服务器

我希望 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 标头。它需要发送到与原始服务器相同的中继服务器上的收件人。

编辑:也许我应该澄清一些事情:在备份机器上,我不能拥有与主服务器相同的邮箱;只有一个邮箱。如果我确实拥有所有邮箱,那么向该服务器发送密件抄送就可以了。但是因为在主服务器上,电子邮件是使用自定义 zarafa 传输传递的,所以我无法让辅助服务器知道有哪些邮箱。因此我想中继到该服务器,并且该服务器也认为自己是相关域的本地服务器。这样,Delivered-To 标头就会告诉我原始 RCTP 是什么。

答案1

有了。。的帮助这一页,我想我快到了,但还没有。我还不知道如何从 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 文件的内容到第二台服务器?

答案2

我需要做一些类似的事情,关于你的问题,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。

然后,该消息将作为标准输入传递到脚本,允许您获取它并自行使用。

我只是希望它对您有用 :)

答案3

您可以尝试使用圆屋或安装MIME去方并使用添加收件人将电子邮件转发到您想要的任何其他服务器。

相关内容