我正在使用 Mailman 和 Exim。当非会员向邮件列表发帖时,Mailman 可以按照以下任一方式进行配置,但每种方式都存在问题:
- 接受它——这会将垃圾邮件分发给所有列表成员。
- 默默地丢弃它——这让那些从辅助地址发送邮件的人感到沮丧和困惑,因为他们没有意识到这不是他们订阅的地址。
- 将其保留以供审核——这给审核员带来了巨大的工作量,他们需要筛选垃圾邮件以寻找少数非垃圾邮件。如果审核员懈怠,我们实际上又回到了案例 (2)。
- 使用退回邮件拒绝它——这会产生反向散射垃圾邮件。
在我看来,最好的选择是执行 Exim 在有人试图向不存在的地址发送邮件时所做的相同操作:在 SMTP 连接时使用错误代码拒绝该邮件。这样,真正的用户将通过发送 MTA 获悉问题,而伪造发件人的垃圾邮件不会产生反向散射。是否可以配置 Exim 以这种方式查询 Mailman 并在 SMTP 时拒绝非成员列表发布?
答案1
这当然是可能的。只是给你一个提示:你可以在 rcpt 阶段的 ACL 中使用 $run 和 $runrc。请参阅第 5 节。在“${run...”下http://www.exim.org/exim-html-current/doc/html/spec_html/ch-string_expansions.html。不过,你必须编写一个脚本,调用“list_members邮件列表“或者您可能会发现“withlist”命令很鼓舞人心……
另一种方法是:为每个列表准备好一个文件(由脚本生成),其中包含列表的所有成员。然后使用 ACL 语句中的查找来搜索该文件中的发件人地址。脚本的核心将是这样的:
while read -r list; do
list_members "$list" > "$EXIM_HOME/mm-lists/$list"
done <<< "$(list_lists -b)"
相应的 ACL 可能是这样的:
deny
domains = +local_domains
condition = ${if exists {MAILMAN_HOME/lists/$local_part/config.pck}{1}{0}}
! senders = ${lookup{$sender_address}lsearch{CONFDIR/mm-lists/$local_part}{$sender_address}}
message = Only list members are allowed to post.
但是这种机制存在问题,例如重写包含成员的文件时出现的竞争问题,可能还有安全问题,asf。
我没有尝试上述代码,也不知道这是否真的有效。这只是给你一个想法,让你尝试一下。
您的动机需要一些修正:在决定是否接受邮件时,您没有避免退回到伪造的发件人地址。您只是没有承担传递退回邮件的责任,而是将其留给发送 MTA。将退回的邮件发送回伪造的地址很困难,并且可能会导致邮件冻结,这是不可取的,但这可能足以激励您尝试您所要求的。