【问题标题】:PHP hostname bindingsPHP 主机名绑定
【发布时间】:2009-03-05 17:39:14
【问题描述】:

如果我编写一个 PHP 脚本连接到 SMTP 服务器(在我的例子中,这是本地安装的 Postfix)并发送一封电子邮件,电子邮件中的第一个“received”标头结果如下:

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)

这是因为普通 Linux 用户(通过 cron)正在调用 PHP CLI。

如何使 PHP CLI 绑定到主机名/IP,以便当用户通过 cron 作业调用它时,“received”标头显示服务器主机名/IP 而不是 localhost.localdomain?

注意1:主机名在hostname --fqnd、/etc/hosts、/etc/sysconfig/network和/proc/sys/kernel/hostname中设置正确

注意 2:我在 PHP 中使用Swift Mailer,尽管这可能无关紧要。

【问题讨论】:

    标签: php linux email


    【解决方案1】:

    考虑认真使用 Swift Mailer 的“NativeMail”甚至“Sendmail”界面。

    这两个选项都将避免网络流量、内部 IP 地址和有问题的 Received 标头。它们的速度也会显着加快,这对您来说可能很重要。

    如果您坚持使用 SMTP,请注意 Swift 使用不会由 CLI 设置的 $_SERVER["SERVER_ADDR"] 变量“自动检测”本地主机名(在 SMTP 对话框中提供)。

    如果你不能让 this 获得更好的值,你可以将它作为第二个参数传递给 Swift 构造函数,如下所示:

    $swift = new Swift(new Swift_Connection_SMTP("localhost"), "my_domain_here");
    

    【讨论】:

    • 我需要设置第二个 Swift 构造函数参数,因为正如你所说,SERVER_ADDR 没有在 CLI 中设置。
    【解决方案2】:

    我相信如果您不通过本地主机地址连接到服务器,而是通过分配的真实IP地址或完全限定的域名连接到服务器,它会更好。

    【讨论】:

    • 这没有任何区别。
    【解决方案3】:

    这是我用来将主机名的值输入到我的 crons 中的一些 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2015-09-28
      • 1970-01-01
      • 2015-11-11
      相关资源
      最近更新 更多