Postfix
postfix 根據“mail from”和“rcpt to”過濾傳入的郵件
我想根據多個標準拒絕發送到我的 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", $_; } }