PHP邮件停止工作

时间:2009-12-12 05:24:53

标签: php email

前几天使用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文件中测试了相同结果的代码。我该如何调试此问题?

6 个答案:

答案 0 :(得分:11)

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

然后,MTA决定如何处理电子邮件。你可能不是谷歌工作,你自己的MTA不是“内”gmail.com。因此,您的MTA必须将发送到gmail.com(forward-path)路径上的下一个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”更好。< / p>

答案 1 :(得分:11)

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


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

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

对于讲德语的人,我前段时间在这个问题上写了一篇非常详尽的“做什么”。见here

答案 2 :(得分:1)

好吧,我打赌你使用的是由其他人管理的免费/商业服务器。不幸的是,有时服务器设置不正确,因此即使您遵循正确的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脚本也不能发送电子邮件,那么......让客户服务中心的人知道并看看你是否能收回你的钱:)

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

不幸的是,由于垃圾邮件的数量和性质,许多人发明了非标准化的处理方法 - RBL,RMX,域密钥,发件人ID,贝叶斯过滤器....这些方法没有任何内在错误但事实上,他们经常在没有知识的情况下由服务提供商单方面应用,更不用说服务用户的同意了。提供商通常对他们实施的条款非常保密。但是如果你发送给gmail那么它可能就像他们使用的贝叶斯式过滤系统一样 - 你检查过垃圾邮件文件夹吗?

因此很可能即使更改已应用于您的影响范围之外的某个地方,也可能不是绝对的阻止,但是通过邮件服务器路由邮件可能需要大量的实验。

下进行。

答案 5 :(得分:0)

尝试将-f参数添加到mail()调用

Signup with email authentication, only 30% are activated?