为什么 sendmail 跳过了我的规则集 98?

为什么 sendmail 跳过了我的规则集 98?

我在 x64 Centos 6.3 上使用 sendmail 8.14.4。并按照 adamo 提供的说明进行操作:如何配置 sendmail(或其他邮件服务器)以接受出站邮件,但不将其发送出去?将所有邮件发送到特定邮箱,如下所示:

LOCAL_RULE_0
R$* < @ $=w . > $*              $#local $: $1 
R$* < @ $* . > $*               $#local $: quicksilver

这可以很好地与 M4 一起编译,并将规则存入 .cf 文件中,而另一个文件似乎默认存在。

不幸的是,sendmail 没有将邮件发送到指定的邮箱。

如果我跑

sendmail -d21.12 [email protected] 

调试输出显示它正在运行 Parse0,但是它跳过了 ParseLocal (98),如下所示:

... 
rewrite: ruleset Parse0           returns: q < @ q . com . >
rewritten as: q < @ q . com . >
-----trying rule: < @ >
----- rule fails
-----trying rule: $*
-----rule matches: $: $> ParseLocal $1
-----skip subr ParseLocal (98)
rewritten as: q < @ q . com . >
-----trying rule: $*
-----rule matches: $: $> Parse1 $1
rewrite: ruleset Parse1             input: q < @ q . com . >
...

测试电子邮件:

echo 'this is a test'| mail -s test_email [email protected]

直接发送至[电子邮件保护]

sendmail -bt
0 [email protected]

翻译为[电子邮件保护](不翻译)但奇怪的是

sendmail -bt
3,0 [email protected]

确实翻译成水银

因此,此时我最好的猜测是,sendmail 在发送邮件时没有首先进行规范化,或者 sendmail 以某种方式设置为在规则集 0 之后不运行本地规则。

对于为什么地址无法翻译,您有什么想法吗?

答案1

好的...我似乎找到了问题...或者至少解决了它。

我检查邮件日志时发现,删除(重新开始)并重新启动 sendmail 后,邮件日志没有重新出现。我重新启动了机器,重置了所有内容,现在一切正常。

我每次都使用“service sendmail restart”重新启动服务,但现在我偶尔会想到它,它会显示停止服务失败。我想,服务可能从未真正正确停止过,因此每次我重新启动时,它要么无法启动,但报告正常,因为它已经在运行,要么正在运行第二个实例。这并不能真正解释为什么“sendmail -bt”会进行转换,除非在调试时,它将配置的单独副本加载到私有上下文中。

为了防止其他人碰巧看到这个帖子,comp.mail.sendmail 组中的一位研究员提出了一种略有不同的方法,如下所示:

他说可以使用 SMART_HOST 捕获所有发往非本地地址的电子邮件。

define(`SMART_HOST',`local:quicksilver')dnl

将重定向到本地帐户。我查看了文档,这似乎是解决问题的另一种好方法。

答案2

我发现调试 sendmail 文件很棘手。问题在于,当您像初次尝试时那样调用 sendmail 时,它所做的根本不是进行传送,它所做的只是运行 sendmail 的提交阶段(通常由 submit.cf 表示),而不是您认为的完整 sendmail.cf 文件。

我不记得 0.3 还是 3.0 是检查事物的最佳方法,两种方法都试一下。

我很确定您的本地规则集正在被应用,只是在提交时没有被应用。

相关内容