postfix 根据“邮件来自”和“接收到”过滤传入邮件

postfix 根据“邮件来自”和“接收到”过滤传入邮件

我想根据多个标准拒绝发送到我的 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_restrictionssmtpd_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.htmlhttp://www.postfix.org/SMTPD_ACCESS_README.html

相关内容