【问题标题】:PHP mail stopped workingPHP 邮件停止工作
【发布时间】:2009-12-12 05:24:52
【问题描述】:

几天前,当我使用mail() 时,它可以工作了。

但现在它不起作用。而且我不知道问题出在哪里。

$to      = 'testmail@gmail.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: sender@gmail.com' . "\r\n" .
    'Reply-To: sender@gmail.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

$mail_sent = @mail( $to, $subject, $message, $headers ); 
echo $mail_sent ? "Mail sent" : "Mail failed";

它显示“已发送邮件”。

我没有接触过 Apache 或这段代码中的任何东西。我已经在一个空的 PHP 文件中测试了代码,结果相同。我该如何调试这个问题?

【问题讨论】:

  • 我假设它实际上并没有发送电子邮件?
  • 这就是问题所在..为什么它停止工作了。如何发送?=)
  • 相同的未修改代码,相同的配置,不同的日子,它现在不起作用? .. 你的邮件引擎是什么 sendmail 或 .. ??
  • 如果您删除了 mail() 之前的“@”,是否会收到错误消息? @ 是错误抑制操作符,所以如果你想调试一些东西,你应该做的第一件事就是去掉 @。
  • 我已经删除了 @ 并在 php.ini 中打开了 E_ALL 但没有显示警告/错误/通知。

标签: php email


【解决方案1】:

是否可以正常发送电子邮件,但被垃圾邮件过滤器捕获? 如果可以,请允许我cross-post myself


几个要点(假设 mail() 返回 true 并且错误日志中没有错误):

  • 发件人地址(“发件人”)是否属于您服务器上的域?如果没有,那就这样吧。
  • 您的服务器是否在黑名单中(例如在 spamhaus.org 上检查 IP)?对于共享主机来说,这是一种遥远的可能性。
  • 邮件是否被垃圾邮件过滤器过滤?使用带有垃圾邮件文件夹的免费邮件程序打开一个帐户并找出答案。此外,请尝试将邮件发送到没有垃圾邮件过滤器的地址。
  • 是否可能需要mail() 的第五个参数“-f”来添加发件人地址? (参见 PHP 手册中的 mail() 命令)
  • 如果您有权访问日志文件,当然要按照上面的建议检查这些文件。
  • 您是否检查“发件人:”地址是否有可能的退回邮件(“退回给发件人”)?您还可以设置一个单独的“出错地址”。

对于讲德语的人,我前段时间就这个问题写了一篇相当详尽的“该怎么做”。见here

【讨论】:

  • 显然违反了第一个要点(正如 mmsmatt 也指出的那样)。当您的服务器显然不是 Gmail 时,不要说 From: someone@gmail.com
【解决方案2】:

当您使用 mail() 发送电子邮件时,php 会将数据交给您在 sendmail_path 中配置的应用程序,即它为 生成一个新进程并传递一些参数和电子邮件数据。此应用程序应该将电子邮件注入邮件传输代理 (MTA) 的队列中。
php 的 mail() 函数的返回值“仅”反映了 php 是否能够生成该进程,将数据流式传输到它并且进程退出而没有错误代码。 IE。 mail()==true 仅告诉您电子邮件(据说)被注入到路由上第一个 MTA 的队列中。

然后 MTA 决定如何处理电子邮件。您可能不为 google 工作,并且您自己的 MTA 不在 gmail.com 内。因此,您的 MTA 必须将其 发送到 gmail.com 路径上的下一个 MTA(转发路径)。这可能有效,也可能无效,但 mail()===true 并没有告诉您任何相关信息。
将邮件从 MTA 中继到 MTA 可能会在任何步骤中失败。当邮件最终“到达”gmail.com 时,最后一个 MTA 或邮件传递代理 (MDA) 也可能出于各种原因拒绝它。

如果发生错误,“当前”MTA 可能(实际上它必须,但这是假设所有配置都正确 ;-))发回错误报告。此错误报告遵循正向路径,但顺序相反(反向路径),最后(或“希望”)始发者收到一封“无法投递的邮件”电子邮件。

(这是简短的版本。它可能不准确,我既不是管理员也不是电子邮件/smtp 专家;-))

那么……你能做什么?

  1. 告诉我们更多关于您的服务器的信息。它是您自己的(家庭/测试)服务器吗?哪个操作系统。你知道安装了哪个“邮件系统”(sendmail、qmail、...)吗?谁配置的?

  2. Server Fault 上询问如何设置您服务器的邮件系统,如果出现问题,它会如何告诉您以及如何说服 google 接受您的电子邮件。

  3. 消除第一个 MTA 或更多,让 php 脚本本身成为第一个 MTA。您可以通过使用例如Swiftmailer(利用它的 smtp 传输模块)而不是 mail()。这样,您服务器的本地邮件系统就不必正常工作。该脚本将“直接”联系谷歌的 SMTP 服务器,验证“你”并将邮件传递给谷歌。它仍然不能保证邮件将被传递,但更有可能立即向您的脚本报告错误,即如果 swiftmailer 发出“Ok”信号,则它比 mail() 返回“true”的可能性更大。

【讨论】:

    【解决方案3】:

    处理您的邮件的 SMTP 服务器可能会拒绝该邮件,因为它声称来自 gmail.com。

    尝试将$headers 中的“发件人”字段更改为您域中的地址。

    【讨论】:

      【解决方案4】:

      好吧,我敢打赌,您使用的是由其他人管理的免费/商业服务器。不幸的是,有时服务器设置不正确,即使您遵循正确的 php 语法,您也无法收到电子邮件。尝试联系其客户服务中心,让他们为您进行诊断。

      这一次发生在我的服务器上(应该归咎于justhost!)所以这可能对您有所帮助。

      从你的 phpinfo() 中检查这些属性; (如果它允许你看到)

      sendmail_from   no value    no value
      sendmail_path   /usr/sbin/sendmail -t -i    /usr/sbin/sendmail -t -i
      

      很可能,这些属性没有配置好。

      我看不出你的 php 语句有什么问题:)

      已编辑:您还可以上传由其他语言编写的邮件脚本(Perl 是最好的,因为大多数 Linux 服务器都默认安装了它)。看看你是否可以从那里发送电子邮件。如果是这样,那么我认为这是服务器配置错误(php.ini 问题?),而不是你的。如果 Perl 脚本也无法发送电子邮件,那么……让客户服务中心的人知道,看看你能不能拿回你的钱:)

      【讨论】:

        【解决方案5】:

        如果你是对的,并且过去可以工作的代码不再工作,那么你的代码之外的东西肯定已经改变了。至少有 2 个 MTA(一个本地,一个远程)可能会干扰您的电子邮件。如果你控制的是本地的,那么检查队列和日志看是否正在转发。

        不幸的是,由于垃圾邮件的数量和性质,很多人发明了非标准化的方法来处理它 - RBL、RMX、域密钥、发件人 ID、贝叶斯过滤器......这些方法本质上没有任何问题但由于它们往往是服务提供者在不知情的情况下单方面应用的,更不用说服务用户的同意了。供应商通常对他们制定的规定非常保密。但是,如果您要发送到 gmail,那么它可能是他们使用的类似贝叶斯的过滤系统 - 您检查过垃圾邮件文件夹吗?

        因此,即使更改已应用到超出您的影响范围的某个地方,它也很可能不是一个绝对的障碍,但是通过邮件服务器路由您的邮件可能需要大量的实验。

        C.

        【讨论】:

          【解决方案6】:

          尝试在mail()调用中添加-f参数

          Signup with email authentication, only 30% are activated?

          【讨论】:

          • $mail_sent = @mail($to, $subject, $message, $headers, '-f localhost');不工作。
          • 不是本地主机,sender@gmail.com
          • 不要从 Gmail 域发送邮件;使用您自己的域。
          猜你喜欢
          • 1970-01-01
          • 2011-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多