我已经使用 PostFix 和 Dovecot/IMAP 设置了一个基本的电子邮件服务器。但我在设置黑名单时遇到了一些问题。
下面是我的 postfix main.cf
smtpd_recipient_restrictions = check_sender_access mysql:/etc/postfix/blacklist.cf reject_unauth_destination
黑名单文件
user = mailuser
password = mailuser2011
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 'REJECT' FROM blacklist WHERE email='%s' AND id=( SELECT id FROM virtual_users WHERE email='%u')
我的 SQL 表有 2 列用于黑名单。即和,id
其中email
id 是个人用户,email 是列入黑名单的地址。
我想要做的是参考邮件中的收件人从数据库中检索地址匹配项。如果我将电子邮件值硬编码为数据库中现有的值,它将能够拒绝被阻止用户的邮件。
但是,如果我使用%u
(我认为它指的是收件人),它根本无法阻止。
答案1
Postfix 中的查找表是键值查找。这意味着您有一个键,查找后会得到一个值。在您的案例 (check_sender_access) 中,键是发件人;而且只有发件人。因此,Postfix 无法满足您拥有两个键(发件人和收件人)的要求。
解决这个问题的唯一方法是政策委派,其中您有多个键(发送者、接收者、IP、主机名、helo ......)来进行查找。
但另一方面,依赖发件人地址是一个非常糟糕的主意,因为这是最容易伪造的。