客观的
我正在尝试配置 CentOS 7 系统,以便将发送到本地系统帐户的所有邮件重定向到备用电子邮件地址。例如,如果邮件发送到,root
我希望将其重定向到[email protected]
。
我有一个使用后缀、通用映射和别名的大致工作配置。如果我使用的完整配置有帮助,请询问,我会修改问题以将其包括在内。
如果有更好的方法可以实现我的目标,请告诉我。我更喜欢坚持使用 postfix,但只是因为它是 CentOS 上的默认 MTA。
问题
我正在尝试将 postfix 配置为智能主机,以便我可以通过 ZOHO 帐户转发邮件。但是,ZOHO极其对发件人地址的格式很挑剔。
当我尝试使用如下发件人地址发送邮件时,它可以正常工作:
[email protected]
但是,当我尝试使用如下发件人地址发送邮件时,失败:
[email protected] (Ryan)
例子
以下是使用完全相同的后缀配置发送的 4 个示例。
允许
我使用这个命令:
mail -r "[email protected]" -s "Testing." root <<< "Test to root."
...并看到这个maillog
(我已将消息精简并重新格式化以使其更具可读性):
CD9FA29D20: from=<[email protected]>
CD9FA29D20: to=<[email protected]>,
orig_to=<root>,
relay=smtp.zoho.com[74.201.154.90]:587,
delay=2.4,
delays=0/0.02/1.7/0.66, dsn=2.0.0,
status=sent (250 Message received)
允许
我使用这个命令:
mail -r "Ryan <[email protected]>" -s "Testing." root <<< "Test to root."
...并看到这个maillog
(我已将消息精简并重新格式化以使其更具可读性):
936C929D20: from=<[email protected]>
936C929D20: to=<[email protected]>,
orig_to=<root>,
relay=smtp.zoho.com[74.201.154.90]:587,
delay=2.3,
delays=0/0.03/1.6/0.7,
dsn=2.0.0,
status=sent (250 Message received)
拒绝中继
我使用这个命令:
mail -r "[email protected] (Ryan)" -s "Testing." root <<< "Test to root."
...并看到这个maillog
(我已将消息精简并重新格式化以使其更具可读性):
D57C529D20: from=<[email protected]>
D57C529D20: to=<[email protected]>,
orig_to=<root>,
relay=smtp.zoho.com[74.201.154.90]:587,
delay=2,
delays=0.01/0/1.4/0.64,
dsn=5.0.0,
status=bounced (host smtp.zoho.com[74.201.154.90] said:
553 Relaying disallowed as [email protected] (Ryan) (in reply to end of DATA command))
拒绝中继
我使用这个命令:
mail -s "Testing." root <<< "Test to root."
...并看到这个maillog
(我已将消息精简并重新格式化以使其更具可读性):
9CFE629D20: from=<[email protected]>
9CFE629D20: to=<[email protected]>,
orig_to=<root>,
relay=smtp.zoho.com[74.201.154.90]:587,
delay=2,
delays=0/0.02/1.4/0.6,
dsn=5.0.0,
status=bounced (host smtp.zoho.com[74.201.154.90] said:
553 Relaying disallowed as [email protected] (Ryan) (in reply to end of DATA command))
问题
这是我遇到问题的最后一例,因为当没有明确包含地址时,默认情况下会以 ZOHO 会拒绝的方式写地址。
重写发件人地址时,后缀是否可以删除或重写某人的姓名?有一个类似的问题这里,但它不能满足我的要求。我不想依靠更改用户帐户设置来确保我的邮件不会被退回。
答案1
解决这个问题的关键是了解 Postfixcleanup
进程如何处理丢失的头信息。从清理手册页:
The cleanup(8) daemon always performs the following transformations:
o Insert missing message headers: (Resent-) From:, To:, Mes-
sage-Id:, and Date:.
一个旧邮件列表帖子给出关于插入标题格式的提示From
:
The defaults are:
MAIL FROM address = UNIX login name
FROM: header = UNIX login name (GECOS information)
由于需要更改或重新格式化的是标题信息,因此使用后缀header_checks
似乎是显而易见的解决方案。但是,它不起作用。阅读header_checks 手册页该部分还有另一个提示BUGS
。
Message headers added by the cleanup(8) daemon itself are excluded from
inspection. Examples of such message headers are From:, To:, Mes-
sage-ID:, Date:.
有另一个邮件列表主题其他人也尝试解决同样的问题,最终他们使用了smtp_header_checks
。 关于 的文档并不多smtp_header_checks
,但是,由于在通过 SMTP 传递邮件时会应用此处理,因此可以使用它来重写From
由 添加的标头cleanup
。
以下是一个/etc/postfix/smtp_header_checks
配置示例,它将From
更改每条发出的信息到:LOCALHOST System <[email protected]>
/^From:.*/ REPLACE From: LOCALHOST System <[email protected]>
请注意,我不是正则表达式专家,所以你可能需要测试你自己的正则表达式而不是依赖于上面的那个。
添加后smtp_header_checks
,必须添加以下配置选项/etc/postfix/main.cf
:
smtp_header_checks = pcre:/etc/postfix/smtp_header_checks
然后重新加载 postfix 配置(假设systemd
)并发送测试消息:
sudo systemctl reload postfix
sendmail [email protected] << EOF
Subject: Test email to root.
Testing.
EOF
答案2
邮件服务器要求有效的电子邮件地址并拒绝无效的地址,这是很常见的。
[email protected] (Ryan)
不是有效的电子邮件地址。维基百科条目有一些有用的指针,以及对相关 RFC 的引用。
实际上,您可以使用裸电子邮件地址:
[email protected]
或任何显示名称后跟邮箱,<>例如:
Ryan <[email protected]>