【问题标题】:php mail 'from' header not behavingphp邮件'发件人'标头没有表现
【发布时间】:2014-05-10 03:05:57
【问题描述】:

我有一个奇怪的问题。

我有一个“标准”电子邮件,我使用它来包装 php mail() 函数。这已经使用了几年,在我网站的两个地方每天都非常高兴地发送邮件。但是,在同一主机上同一站点的不同部分重新使用相同的包含时,我发现我无法发送包含“发件人”标头的邮件。唯一的区别是站点上的这个新发送位置是一个基本的身份验证保护目录。

所以在人们跳进来告诉我这个或那个之前,请记住,这与它在同一主机上同时工作的代码完全相同,因此完全相同的 include 工作在两个位置而不是第三个位置。

所以我设置了其他标题(因为它带有多部分 HTML 电子邮件):

$headers  = "From: $fromName <$fromEmail>\n";
$headers .= "Reply-To: \"$fromName\" <$fromEmail>\n";
$headers .= "Sender: \"$fromName\" <$fromEmail>\n";

这在站点的两个位置都可以正常工作,但是包含“发件人”行会导致同一主机上的第三个位置的邮件发送失败。该代码在我的开发机器上也可以正常工作,只是 Live 托管的盒子不会从第三个位置发送邮件。现在...

  1. 是的,我知道我使用的是“\n”而不是“\r\n”,但我的经验是 "\r\n" 在 Windows 主机上是必需的,但在 *ix 上会导致问题 主机 - 是的,我知道 RFC 说 CRLF - 所以这是“固定的” 稍后在包装器中,如果它在 Windows 主机上但保留为 "\n" on *ix
  2. 不,设置“\r\n”没有任何区别!
  3. 我已经体验过 mail() 第五个参数并使用 -f,但是 只给我代表发送的邮件
  4. “发件人”字段实际上具有收件人打开邮件时看到的效果;然而,从 Pretty_name [email_address],至少在 Outlook 中,发件人在邮件列表中显示为 email_address,而不是“Pretty_name”
  5. 我使用过 ini-set,但它只设置了一个电子邮件地址,并且邮件已经与所需的 From Email 地址一起发送,它的“Pretty_name”不起作用

所以请记住 - 完全相同 代码在同一站点的其他地方运行而没有任何问题,但这里的问题似乎是(出于我尚未理解的原因)相同的代码只能在没有来自该位置的“发件人”标头的情况下使用。

有人对这种看似不一致的行为有什么想法吗?

谢谢

【问题讨论】:

  • 您能否详细说明实际失败的原因:服务器是否报告它无法投递邮件,或者您只是没有收到邮件?您是否尝试过发送到不同的帐户以查看它是否被垃圾邮件过滤器或有效来源的类似限制阻止?
  • mail() 返回布尔值 FALSE,表示邮件未发送...而且我没有收到任何内容。没有发出错误或警告,只是不会有它!

标签: php email


【解决方案1】:

首先,如果 mail() 返回 false,则确保输出最后一条错误消息:

print_r(error_get_last());

如果错误消息并没有真正表明电子邮件本身的很多内容,那么很可能是 php.ini 文件中有问题(例如升级期间的配置错误或其他什么)。您可以通过将问题代码隔离到一个单独的文件来测试它,然后暂时将 php.ini 文件换成默认文件,重新启动您的 Web 服务器以使新的 php.ini 生效,然后再次运行您的测试(I' d 建议将 phpinfo() 与您的脚本一起转储,以便您确认新的 php.ini 已生效)。

其次,使用\r\n。我知道它在您的测试中没有功能差异,但它是正确的行结尾并且仅使用 \n 会导致某些实际遵循规则的邮件服务器出现问题。当您使用 \n 时,您依赖于邮件服务器来处理自动更正错误的附加代码。

使用 \r\n 可能会导致一些不遵守规则的编码不佳的服务器出现问题,但这并不是您真正要解决的问题。始终遵循 RFC。

【讨论】:

    猜你喜欢
    • 2011-01-02
    • 2016-12-02
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 2014-04-24
    • 2011-04-07
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多