使用 Postfix 时,如何删除或重写发件人地址的发件人姓名?

使用 Postfix 时,如何删除或重写发件人地址的发件人姓名?

客观的

我正在尝试配置 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]> 

相关内容