我有一个非常简单的 Exim 配置,它只是将所有邮件转发到一组目标地址。当立即投递到某个地址失败时,该邮件将被添加到队列中(然后由重试规则处理)。我想改变这一点,以便如果立即投递失败,则邮件为 :blackhole:d。(如果生成退回邮件也没关系,因为我只需将退回邮件重定向到 :blackhole:)。
这需要在临时故障(即 4xx)和永久故障(即 5xx)时发生。
我理解这意味着如果不能立即送达,消息将永久且不可挽回地丢失。在这个特定情况下,这不是问题。
读完这篇文章,它听起来很像“我如何改进我的垃圾邮件 Exim 服务器”。这实际上不是我的目的,如果你能找到一种方法来证明这一点,我很乐意这样做!
答案1
进出口银行广泛的配置用于设置重试次数。在您的 exim.conf 中,底部附近会有一个重试部分。重试配置包括三个字段:电子邮件地址、导致失败的错误代码和时间模式列表。这些定义为一组三个数字:字母行为代码、应用此规则的时间长度和重试间隔。例如:
F,2h,15m
可以理解为“2小时内,每15分钟尝试一次固定内部”,
您可以尝试设置一个空的重试:
begin retry
* *
这可能会让 exim 感到不快。相反,你可以使用一分钟的单次重试:
begin retry
* * F,1m,1m
这不完全是您所要求的,但非常接近。
您还可以选择针对特定电子邮件地址和不同的返回代码进行更改。
答案2
将重试时间设置为非常长,执行 cron 脚本从长度大于 x 的队列中提取消息 ID exim -bpu
,然后使用exim -Mrm <msgid>
您也可以使用 将 exim 作为非排队守护进程运行mua_wrapper = true
。请参阅第 48 节“使用 Exim 作为非排队客户端”,它可能会满足您的需要。
当传递失败时,错误消息将写入标准错误流(以及 Exim 的日志),并且 Exim 退出并返回调用者,返回码值为 1。该消息将从 Exim 的假脱机文件中删除。不会生成任何退回消息。
不维护任何重试数据,并且忽略任何重试规则。
答案3
您可以system_filter
在 exim.conf 中设置选项吗?之后,在配置系统过滤文件中,创建一条如下规则:
if not first_delivery then
seen finish
endif
第一次投递后,exim会将消息再次放入队列,但当再次尝试处理时,它将被丢弃。