好的,我需要在我的服务器上托管一个 PHP 脚本,以便将电子邮件发送到我自己服务器上的“标记”电子邮件地址,例如“[电子邮件保护]“。我也使用自己的服务器作为 SMTP 服务器,PHP 使用其mail()
命令。因此,我的服务器既可以发送也可以接收。
为了接收发送到我的服务器上的标记地址的邮件,我已配置 Postfix' main.cf
:
recipient_delimiter = +
为了发送这些,main.cf
还包含:
recipient_canonical_maps = regexp:/etc/postfix/recipient_canonical_maps
这些“规范映射”由一个正则表达式行组成:
/^(.+)\+.+@(.*)/ ${1}@${2}
现在:
(1)
电子邮件发送至:[电子邮件保护],通过我的现场 PHP 脚本甚至从 Linux shell 重写并发送到[电子邮件保护],将从标题+tag
中删除To:
,保留原样,并插入[email protected]
一个附加标题。X-Original-To: [email protected]
我可以理解这种行为,因为我在 中配置了它recipient_canonical_maps
。因为如果我不这样做,带有标记地址的电子邮件就不会到达任何地方:
Feb 13 21:00:00 myserver postfix-local[11626]: cannot chdir to mailname dir user+tag: No such file or directory
Feb 13 21:00:00 myserver postfix-local[11626]: Unknown user: [email protected]
(当从 main.cf 中取出 Recipient_canonical_maps 时,/var/log/mail.log)
(2)
同时,客户端软件(例如 Thunderbird)使用我的服务器 SMTP 端口 25 向 等标记地址发送的电子邮件在标题中保留了[email protected]
其内容,尽管它们也添加了上述标题。它们被正确地传递到它们所属的位置,即 的邮箱。+tag
To:
X-Original-To:
[email protected]
我的目标是通过 (1) 实现 (2) 中的行为,即 PHP 脚本或 shell 命令,正确发送电子邮件,同时保留标记的To:
地址。
我的问题是:
- 我可能做错了什么、哪里做错了?
- 为什么 (1) 和 (2) 表现不同?这是否暗示了需要进一步研究的地方?
任何建议都值得赞赏!
答案1
@AB 的评论让我走上了正确的道路(奇怪的是这条评论消失了);他提到了信封和“真实”To:
报头之间的区别。此外,Postfix 在重写报头时确实对远程客户端和本地计算机有所区别:
规范地址映射
Postfix 2.2 及更高版本仅当客户端与 local_header_rewrite_clients 参数匹配时才会重写来自远程 SMTP 客户端的邮件头(...)(参见:http://www.postfix.org/ADDRESS_REWRITING_README.html)
Postfixmain.cf
有一个参数可以控制重写哪些标题:
recipient_canonical_classes = envelope_recipient, header_recipient
那是我的配置。
我的问题已得到解决删除header_recipient
从此设置中。因此,标记的To:
标题被保留,电子邮件被传递到其所属的位置。