![如何防止在向 Postfix 中的别名发送邮件时发送休假自动回复?](https://linux22.com/image/576729/%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2%E5%9C%A8%E5%90%91%20Postfix%20%E4%B8%AD%E7%9A%84%E5%88%AB%E5%90%8D%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6%E6%97%B6%E5%8F%91%E9%80%81%E4%BC%91%E5%81%87%E8%87%AA%E5%8A%A8%E5%9B%9E%E5%A4%8D%EF%BC%9F.png)
我有一个别名,它有 20 个邮件帐户。因此,当向此别名发送邮件时,每个人都会收到它。但是,当我在这 20 个邮件帐户中的一个上设置假期时,也会发送自动回复。我想排除这些情况 - 当邮件在收件人:或抄送:标头中没有特定的邮件帐户时。该脚本名为 vacation.pl,来自 postfixadmin。
除了手动编辑脚本之外,还有其他方法吗?
答案1
简短的回答是“否”。至少如果你的设置和脚本与我的类似的话。
今天我仔细研究了我们与 Postfixadmin 结合使用的 vacation.pl。
我假设它们是相同的,但谁也无法确定,所以要小心。在脚本的第一行中,它说明了以下关于版本的内容:
# Virtual Vacation 4.0
# $Revision: 893 $
在我们的例子中,自动回复的激活会在 Postfix 的别名表中添加如下条目:
[email protected]@autoreply.example.org,[email protected]
这意味着该电子邮件将保存到用户的邮箱并转发到自动回复域(autoreply.example.org)。
在传输图中,有以下条目,它将邮件传递给 master.cf 中定义的休假服务:
autoreply.example.org vacation:
为了完整性,下面是我的 master.cf 中的条目:
vacation unix - n n - - pipe
flags=Rq user=vacation argv=/var/spool/vacation/vacation.pl -f ${sender} ${recipient}
这意味着,在别名解析后,vacation.pl 脚本被触发。
因此,如果您想阻止自动回复已发送到别名的电子邮件,您将需要向脚本添加一个功能,该功能将检查 X-Original-To-Header,这样您就可以确定邮件是否已发送给具有多个收件人的别名。
在第 312 行左右定义了一个函数 find_real_address。该函数将搜索真实地址(用户)。
可以将此函数的修改版本与 X-Original-To-Header 中的电子邮件地址结合使用,以便仅当电子邮件地址不是具有多个收件人的别名之一时才发送自动回复。
我还没有尝试过上述任何建议,所以要小心。
答案2
这一切都取决于您的休假回复在何处生成;通常,这是通过指向用户邮箱的 .forward 文件中的脚本的链接完成的。
由于这不适用于虚拟邮箱,因此存在几种替代方法 - 使用专用过滤器、传输、MDA 或过滤器。
甚至可能更多。
postconf -n
您必须提供更详细的信息,至少包括与此场景相关的输出和任何地图文件。
还包括发送到此分发列表别名的消息的记录,以及包含休假回复在内的结果消息。
答案3
我正在寻找同样的东西,我正在使用 Webmin 运行我的电子邮件服务器,自动回复邮件是使用脚本执行的/etc/webmin/virtual-server/autoreply.pl
通过阅读我发现了这个块:
if ($header{'x-mailing-list'} ||
$header{'list-id'} ||
$header{'precedence'} =~ /junk|bulk|list/i ||
$header{'to'} =~ /Multiple recipients of/i ||
$header{'from'} =~ /majordomo/i ||
$fromline =~ /majordomo/i) {
# Do nothing if post is from a mailing list
exit 0;
}
因此我添加了另一个条件$header{'to'} =~ /my_alias_name_here/i ||
,这样它就不会对发送到该别名的任何电子邮件发送自动回复。
这是一个快速破解方法,也许我稍后会花些时间让它列出服务器上的所有别名。如果你之前做过,请分享脚本 :)
答案4
我们通过改变两处来解决上述问题:
1)传递原始收件人,而不是来自后缀到 vacation.pl 脚本:
vacation unix - n n - - pipe
flags=Rq user=vacation argv=/usr/lib/postfixadmin/vacation.pl -f ${sender} -- ${recipient}
vacation unix - n n - - pipe
flags=Rq user=vacation argv=/usr/lib/postfixadmin/vacation.pl -f ${sender} -- ${original_recipient}
2)调整假期.pl脚本,所以它不会发送带有别名的休假消息多个收件人。
#MC my $vemail = $email;
#MC $vemail =~ s/\@/#/g;
#MC $vemail = $vemail . "\@" . $vacation_domain;
#MC $logger->debug("Looking for alias records that '$email' resolves to with vacation turned on");
#MC my $query = qq{SELECT goto FROM alias WHERE address=? AND (goto LIKE ? OR goto LIKE ? OR goto LIKE ? OR goto = ?)};
#MC $stm->execute($email,"$vemail,%","%,$vemail","%,$vemail,%", "$vemail") or panic_execute($query,"address='$email'");
$logger->debug("Looking for alias records that '$email' resolves to with vacation turned on");
my $query = qq{SELECT goto FROM alias WHERE address=?};
my $stm = $dbh->prepare($query) or panic_prepare($query);
$stm->execute($email) or panic_execute($query,"address='$email'");
$rv = $stm->rows;
...
#MC do not send away-message to alias with multiple recipients
# for (split(/\s*,\s*/, lc($alias))) {
# my $singlealias = $_;
# $logger->debug("Found alias \'$singlealias\' for email \'$email\'. Looking if vacation is on for alias.");
# $rv = check_for_vacation($singlealias);
## Alias has vacation
# if ($rv == 1) {
# $realemail = $singlealias;
# last;
# }
# }
$logger->debug("Found multiple aliases \'$alias\' for email \'$email\'. Thus, not sending vacation reply.");
$realemail = $email;
$rv = 0;