我在 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 是检查事物的最佳方法,两种方法都试一下。
我很确定您的本地规则集正在被应用,只是在提交时没有被应用。