经过大约 30 个小时几乎绞尽脑汁之后,我不得不得出结论,最好把这篇文章写给那些可能更熟悉这个主题的人。
我有一个使用 Ubuntu 22 的 Digitalocean 服务器。
是的,我知道 Digitalocean 不支持发送邮件等,但我只是使用 postfix 作为简单的中继服务器,没有其他用途。
基本上,我现在正在使用 Amazon SES 向例如“ [email protected] ”发送邮件。我有多个域需要处理,而不仅仅是一个,并且所有这些域的配置(DNS)都正确设置为指向服务器。它之前确实与 brevo 一起使用,但我肯定是配置错误,因为他们因违反 TOS 而随机暂停了帐户,当然没有给出任何理由,只是说“很抱歉您被暂停了”。
我怀疑我直接从发件人那里转发了“发件人:”地址,他们认为有人接管了帐户或做了其他事情,这是公平的。
无论如何...现在我已经描述了基本设置和情况。问题是,我设置了一个过滤器,这对于实现这一点至关重要,如果我在 master.cf 中创建自定义 content_filter 服务,情况似乎如下:
shell_content_filter unix - n n - - pipe
flags=Rq user=filteruser argv=/usr/local/bin/minimal_filter.sh
这是我们可以看到问题日志的一部分:
"relay=shell_content_filter, delay=0.04, delays=0.01/0/0/0.02, dsn=2.0.0, status=sent (delivered via shell_content_filter service"
在 main.cf 中:
content_filter = shell_content_filter
receive_override_options = no_address_mappings
是的,有一个“filteruser”被创建,并且它工作正常,所有权限都正确设置并经过测试,一切运行正常,但我的过滤器被识别为中继,而且它实际上是说电子邮件是由外部服务传递的,这毫无意义......至少对我来说是这样。
不确定这些信息是否足够,如果有人知道发生了什么,我将不胜感激,因为我遇到了很大的麻烦,电子邮件丢失了,永远无法恢复,而且我仍然无法让它工作。
最终,我通过以下方式解决了我的问题:
也许我没有清楚地表达我最初的问题,抱歉。基本上,我希望能够覆盖“发件人”地址行,并添加Reply-To标题行,但使用header_checks似乎不可能,因此我不得不求助于milter或content_filter,但无论出于什么原因,这些解决方案都没有奏效,我在网上搜索了好几天,尝试了各种解决方案。
当然,我也尝试过咨询 GPT,因为多年来我几乎每天都在使用它,它确实提出了一些建设性的意见,但 o1 模型很糟糕,而 GPT 4 遗留模型很容易解决了我的问题。
最后,我尝试不使用“ main.cf ”中的“全局设置”,而是直接在“ master.cf ”中定义的一个自定义服务下进行设置,这样就成功了。content_filter工作正常,也不再出现无限循环,这是后来出现的新问题,通过“ -o accept_override_options=no_address_mappings ”解决了这个问题,这很有趣,因为如果我将此选项作为“全局设置”添加到“ main.cf ”中,它不起作用!只有当我将其直接添加到要执行的命令下时,它才开始工作。
最重要的部分是,是的,postfix 为我们的外部脚本(在我的情况下,我编写了一个 php 脚本)提供了原始数据,我们可以使用 STDIN 读取这些数据,但仅仅执行 STDOUT 是不够的,这对我来说并不清楚。我不得不使用 sendmail 将修改后的电子邮件数据“发送回”或“注入回”到 postfix 服务,如果不小心,这确实会导致无限循环。所以基本上这就是我所忽略的。是的,它确实将其视为外部脚本是一个“中继”,因此 postfix 并不认为它只是过滤它的东西,并且对其进行了进一步的处理,但如果我错了,请纠正我。无论如何,我使用 php 脚本中的 sendmail 将修改后的电子邮件发回,然后,一切都运行正常。
希望这对将来的某人有所帮助!
抱歉,如果我最初的问题不够清楚,我对发表此类帖子还不太熟悉。