我想根据多个标准拒绝发送到我的 postfix 服务器的电子邮件,特别是我想阻止来自俄罗斯电子邮件地址(或包含西里尔字符,但我怀疑这更难)的电子邮件,这些电子邮件发送给两个特定收件人(但不是如果是写给别人的话)。
我觉得这应该很简单,特别是因为“mail from”和“rcpt to”地址都是在 smtp 协商开始时提供的。但我找不到用 postfix 来做到这一点的方法,并且不确定我是否需要一些附加包(milter?)。
答案1
添加一个限制等级。例如:
/etc/postfix/main.cf:
smtpd_recipient_restrictions =
check_recipient_access hash:/etc/postfix/recipient_access
smtpd_restriction_classes = no_russians
no_russians = check_sender_access pcre:/etc/postfix/no_russians
/etc/postfix/recipient_access:
[email protected] no_russians
[email protected] no_russians
/etc/postfix/no_russians:
/\.ru$/ REJECT
答案2
基本上复制/粘贴自https://sources.debian.org/src/postfix/3.6.4-1/examples/smtpd-policy/greylist.pl/#L257并随着我们的进展进行调整,这里有一个简单的 Perl 脚本,可以no_ru.pl
作为一个简单的check_policy_service
脚本来实现。看http://www.postfix.org/SMTPD_POLICY_README.html了解如何将其挂入。
未经测试,YMMV 等。您可能需要use
并可能初始化一些设施,例如syslog
-- 首先从命令行尝试此操作。
# Unbuffer standard output.
#
select((select(STDOUT), $| = 1)[0]);
#
# Receive a bunch of attributes, evaluate the policy, send the result.
#
%attr = ();
$ru_sender = $ru_rcpt = 0;
while (<STDIN>) {
if (/^\s*sender=.*\.ru\n/i) {
$ru_sender = 1;
} elsif (/^\s*recipient=.*\.ru$/i) {
$ru_rcpt = 1;
} elsif ($_ eq "\n") {
if ($verbose) {
syslog $syslog_priority, "ru_sender %i, ru_rcpt %i", $ru_sender, $ru_rcpt;
}
$action = ($ru_sender && $ru_rcpt) ? "reject" : "dunno";
syslog $syslog_priority, "Action: %s", $action if $verbose;
print STDOUT "action=$action\n\n";
%attr = ();
} else {
chop;
syslog $syslog_priority, "warning: ignoring garbage: %.100s", $_;
}
}
答案3
查看smtpd_recipient_restrictions
和smtpd_sender_restrictions
指令。使用它们,您可以配置包含所需过滤器的哈希映射。
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/sender_access
/etc/postfix/sender_access:
.ru REJECT
[email protected] REJECT
也可以看看http://www.postfix.org/ADDRESS_VERIFICATION_README.html和http://www.postfix.org/SMTPD_ACCESS_README.html