PHP主机名绑定
问题描述:
如果我编写一个PHP脚本连接到SMTP服务器(在我的情况下,这是本地安装的Postfix)并发送一封电子邮件,电子邮件中的第一个“收到”标题为:PHP主机名绑定
Received: from [SERVER_IP] (SERVER_HOSTNAME [127.0.0.1]) by SERVER_HOSTNAME (Postfix) with ESMTP id D682A34381 for <TO_EMAIL>; Thu, 5 Mar 2009 17:25:18 +0000 (GMT)
这是因为PHP脚本正在通过浏览器访问,Apache绑定到SERVER_IP。
但是,如果我从PHP CLI执行相同的脚本,那么第一个“已接收”报头,而不是:
Received: from localhost.localdomain (SERVER_HOSTNAME [127.0.0.1]) by SERVER_HOSTNAME (Postfix) with ESMTP id AB51934381 for <TO_EMAIL>; Thu, 5 Mar 2009 17:18:01 +0000 (GMT)
这是因为PHP CLI是由一个普通的Linux用户调用(通过一个cron)。
如何让PHP CLI绑定到主机名/ IP,以便当用户通过cron作业调用它时,“received”标题显示服务器主机名/ IP而不是localhost.localdomain?
注1:主机名在主机名--fqnd正确设置,/ etc/hosts中,在/ etc/SYSCONFIG /网络和/ PROC/SYS /内核/主机名
注2:我在PHP中使用Swift Mailer,虽然这可能是不相关的。
答
请认真考虑使用Swift Mailer的“NativeMail”或甚至是“Sendmail”界面。
这两个选项都将避免网络流量,内部IP地址和收到的问题头。它们也将显着更快,这对您可能很重要。
如果您坚持使用SMTP,请注意,Swift使用$_SERVER["SERVER_ADDR"]
变量“自动检测”本地主机名(在SMTP对话框中提供),CLI不会设置该变量。
如果无法安排这有一个更好的价值,你可以将它传递给斯威夫特构造函数的第二个参数,如:
$swift = new Swift(new Swift_Connection_SMTP("localhost"), "my_domain_here");
答
这里是我用来获取价值的一些PHP代码的主机名到我的克朗:
//get hostname info from /etc/sysconfig/network
preg_match('/HOSTNAME=(.*)/', file_get_contents('/etc/sysconfig/network'), $network);
$hostname = split("\=", $network[0]);
echo $hostname[1]; //this equals the value of your HOSTNAME
我需要设置第二个Swift构造函数参数,因为如您所说,SERVER_ADDR未在CLI中设置。 – DavidM 2009-03-08 16:28:19