Postfix

postfix 根據“mail from”和“rcpt to”過濾傳入的郵件

  • April 18, 2022

我想根據多個標準拒絕發送到我的 postfix 伺服器的電子郵件,特別是我想阻止來自俄羅斯電子郵件地址(或包含西里爾字元,但我懷疑這更難)發給兩個特定收件人(但不是如果寄給其他人)。

我覺得這應該很簡單,特別是因為“郵件發件人”和“rcpt 收件人”地址都是在 smtp 協商開始時提供的。但是我找不到使用 postfix 的方法,並且不確定我是否需要一些附加包(milter?)。

添加一個限制類。例如:

/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:
recipient1@mydomain.com     no_russians
recipient2@mydomain.com     no_russians

/etc/postfix/no_russians:
/\.ru$/ REJECT

基本上從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", $_;
 }
}

引用自:https://unix.stackexchange.com/questions/231232