使用mysql数据库将传出邮件拖放到以前不可用的邮箱中

我们有一个更大的社区门户网站,这个门户网站多年来越来越大,但也有一些死亡账户。 最近,服务器的IP被列入黑名单,因为用户的许多邮件地址不再可用(550),服务器向他们发送通讯。

为了避免这种情况,我在发送php脚本中筛选出已知不可用的邮箱,但是我想让exim接pipe这个工作,因为它更通用。

我的计划是使用MySQL数据库列出不可用的邮箱。 我想使用一个简单的脚本来遍历日志文件,并将不可用的邮箱电子邮件地址保存到数据库。

我不确定一些提供商是否只假装邮箱因为服务器位于黑名单而不可用, 但是,一旦有40%的邮件被拒绝,我无法想象有这么多的用户删除了他们的邮件账户。 此外,我必须考虑到,删除的帐户可能会(重新)在某个时间创build。 所以随着地址我会存储一个时间戳,可以说,在未来4周。 在这段时间内,地址的所有邮件都必须被删除。 如果在这4周后的第一封邮件可以发货,一切都很好。 否则,这段时间应该延长(指数退避等)。

我可以用脚本覆盖所有这些,我甚至已经知道如何一个SQL查询,给出一个阻塞的地址列表将如下所示:

SELECT blocked FROM maildrop WHERE name=${localpart}@${domain} and timestamp<UNIX_TIMESTAMP() 

但问题是,我如何正确地将其整合到eximconfiguration中? 起初我以为我可以使用虚拟别名,并将邮件redirect到devnull @ localhost用户的邮件pipe道到/ dev / null。

我使用以下configuration对其进行了testing

 mysql_sys_aliases: debug_print = "R: mysql_sys_aliases for $local_part@$domain" driver = redirect allow_fail allow_defer data = ${lookup mysql{SELECT login FROM aliases WHERE alias='${local_part}@${domain}'}} 

顺便说一句:我也testing了mysql_aliases而不是mysql_sys_aliases

和以下数据库条目:别名:[email protected] | login名:devnull @ localhost

但没有成功。 我仍然在externaldomain.com收到邮件

然后,我也发现这个post在哪里使用acls,但我无法得到它的工作。 另外我不确定这是否适用于由系统直接发送的邮件(不通过外部SMTP) https://serverfault.com/a/577007/239968

你将如何解决?

经过漫长的一天的尝试和错误,我只是发现它是如何工作的。 令人惊讶的是容易在restrospect。

在Debian上,确保你已经安装了exim4-daemon-heavy软件包来支持mysql。 我也假设使用了一个分割configuration(所有path都是相对于/etc/exim4/conf.d/)。

然后至less创build一个包含黑名单邮件地址的列的数据库。 这个cokumn应该被索引。

创build文件main / 50_exim4-config_failmail,并把mysql的凭证放在里面:

 hide mysql_servers = MYSQL_HOST/MYSQL_DB/MYSQL_USER/MYSQL_PASS 

此外创build路由器/ 050_exim4-config_failmail_router并添加:

 failmail: driver = redirect data = ${lookup mysql { SELECT '/dev/null' FROM dropmail WHERE email='${local_part}@${domain}'} {$value} } file_transport = address_file 

文件名以050开头非常重要,因为它必须在其他路由器之前加载。 否则,规则将被忽略。 花了我几个小时的时间才发现,如果你命名文件“50_exim4-config …”,这会有很大的不同。 在这种情况下,它的规则在400规则集之后被处理,并且所有发出的邮件已经被发送。

这不是原来的问题的完整解决scheme,因为我简化了一下,找出发生了什么。 但基于此,应该很容易扩展数据库表和查询​​以匹配上面概述的function。