前几天使用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文件中测试了相同结果的代码。我该如何调试此问题?
答案 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专家; - )
那么......你能做什么?
告诉我们有关您的服务器的更多信息。它是你自己的(家庭/测试)服务器吗?哪个操作系统。你知道安装了哪个“邮件系统”(sendmail,qmail,...)?谁配置了它?
询问Server Fault如何设置服务器的邮件系统,如何告诉您是否出现问题以及如何说服Google接受您的电子邮件。
消除第一个MTA或更多,让php脚本本身成为第一个MTA。您可以使用例如Swiftmailer(利用其smtp传输模块)而不是mail()。这样,服务器的本地邮件系统就不必正常工作。该脚本将“直接”联系谷歌的SMTP服务器,验证“你”并将邮件发送到谷歌。它仍然不能保证邮件将被传送,但更有可能的是,错误会立即报告给您的脚本,即如果swiftmailer发出“Ok”信号,那么它更可能比mail()返回“true”更好。< / p>
答案 1 :(得分:11)
电子邮件是否可以正常发送,但被垃圾邮件过滤器捕获? 如果是这样,请允许我cross-post myself:
一些要点(假设mail()返回true并且错误日志中没有错误):
对于讲德语的人,我前段时间在这个问题上写了一篇非常详尽的“做什么”。见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()
调用