我已成功设置了 postfix 以查找用于服务虚拟域的 sql 表。我想要做的是拒绝并立即断开以下任何客户端的连接:
1.尝试MAIL FROM:
与我的任何虚拟域匹配的域
和
2. 不是本地客户端(连接来自 my_networks)。
(我的域名的合法用户想要发送邮件,请使用其他规则的 587 提交服务)
第 2 点是通过以 开始来完成的smtpd_sender_restrictions
。permit_mynetworks
然后我想附加check_sender_access = ????
我不知道应该在 ???? 中输入什么来查询 SQL 查询。我知道如何用访问哈希表来做到这一点。我不想使用哈希,因为有效域已经在 SQL 中,而且每次我添加域时,我都不想更新访问哈希表。
问题是,REJECT
如果 SQL 查询返回任何值,我应该是邮件发件人,OK
如果查询不返回任何行,我应该是邮件发件人。我不知道如何使用 SQL 表达该模式 - 操作。
谢谢。
答案1
你应该能够使用这个来实现这一点:
smtpd_sender_restrictions = permit_mynetworks
reject_sender_login_mismatch
这将允许任何仅来自 $mynetworks 的 MAIL FROM,或者如果客户端已登录并通过 smtpd_sender_login_maps 列为 MAIL FROM 的所有者。然后,例如,您可以通过 mysql 创建一个“假”查找表,该表始终为您的虚拟域返回不存在的 SASL 登录名。
在 main.cf 中
smtpd_sender_login_maps = proxy:mysql:/etc/postfix/mysql-sender-login-maps.cf
和 mysql-sender-login-maps.cf 像这样
user = database_user
password = users_password
query = SELECT 'NON_EXISTING_SASL_LOGINNAME' FROM maildb.mail_users WHERE email='%s' UNION SELECT 'NON_EXISTING_SASL_LOGINNAME' FROM maildb.mail_domains WHERE CONCAT('@', domain) = '%s'
为此,您需要 Postfix 2.2 或更高版本,否则您必须使用 mysql-sender-login-maps.cf 中的 db_name、table 和 select_field 来构建它。您只需要为现有的 MAIL FROM 地址和域返回该值,否则任何人都无法将邮件发送到您的服务器。
答案2
也许你想看看http://workaround.org/ispmail/squeeze/postfix-database-configuration。这是更大的指南的一部分,即构建以数据库为中心的邮件服务器。