PHP邮件函数无法完成电子邮件的发送

<?php
$name=$_POST['name'];
$email=$_POST['email'];
$message=$_POST['message'];
$from='from:yoursite.com';
[email protected]';
$subject=‘客户查询’;
$body=“From:$name\n电子邮件:$email\n邮件:\n$Message”;
如果($_POST['submit'])){
如果(邮件($to、$subject、$body、$from)){
回显“<p>您的邮件已发送!</p>”;
}否则{
echo“<p>出现问题,请返回并重试!</p>”;
}
}
?>

我试着创建一个简单的邮件表单。表单本身位于我的index.html页面上,但它会提交到一个单独的“感谢您的提交”页面,thankyou.php,上面的php代码就嵌入了该页面。
代码提交得很完美,但从不发送电子邮件。我怎样才能解决这个问题

尽管此答案的某些部分仅适用于mail()函数本身的使用,但这些疑难解答步骤中的许多步骤都可以应用于任何PHP邮件系统。

您的脚本不发送电子邮件的原因有很多。除非有明显的语法错误,否则很难诊断这些问题。如果没有,你需要浏览下面的检查表,找出你可能遇到的任何潜在陷阱

确保已启用错误报告并设置为报告所有错误

错误报告对于根除代码中的错误和PHP遇到的一般错误至关重要。需要启用错误报告才能接收这些错误。将以下代码放在PHP文件的顶部(或主配置文件)将启用错误报告

错误报告(-1);
ini_设置(“显示错误”、“打开”);
设置“错误”处理程序(“变量转储”);

查看如何在PHP中获取有用的错误消息关于这方面的更多细节,请参阅此答案

确保调用了mail()函数

这可能看起来很愚蠢,但一个常见的错误是忘记在代码中实际放置mail()函数。确保它在那里并且没有被注释掉

确保正确调用了mail()函数

bool邮件(字符串$to,字符串$subject,字符串$message[,字符串$additional_headers[,字符串$additional_parameters]]))

mail函数接受三个必需的参数,还可以选择第四个和第五个参数。如果对mail()的调用没有至少三个参数,则将失败

如果对mail()的调用没有正确顺序的正确参数,它也将失败

检查服务器的邮件日志

您的web服务器应该记录通过它发送电子邮件的所有尝试。这些日志的位置会有所不同(您可能需要询问服务器管理员它们的位置),但它们通常可以在用户的根目录下的日志中找到。里面将是服务器报告的错误消息,如果有的话,与您发送电子邮件的尝试有关

检查端口连接故障

端口阻塞是大多数开发人员在集成代码以使用SMTP发送电子邮件时面临的一个非常常见的问题。而且,这可以很容易地在服务器邮件日志中进行跟踪(邮件日志的服务器位置可能因服务器而异,如上所述)。如果您在共享主机服务器上,端口25和587在默认情况下保持阻塞状态。此阻止是由您的主机提供商故意执行的。即使对于某些专用服务器也是如此。当这些端口被阻止时,请尝试使用端口2525进行连接。如果您发现该端口也被阻止,那么唯一的解决方案是联系您的主机提供商以取消阻止这些端口

大多数托管提供商都会阻止这些电子邮件端口,以保护其网络不发送任何垃圾邮件

端口25或587用于普通/TLS连接,端口465用于SSL连接。对于大多数用户,建议使用端口587以避免某些主机提供商设置的速率限制

不要使用错误抑制操作符

当错误抑制运算符@在PHP中的表达式前面加上时,将忽略该表达式可能生成的任何错误消息。在某些情况下,必须使用此运算符,但发送邮件不是其中之一

如果您的代码包含@mail(…),那么您可能隐藏了重要的错误消息,这将有助于您调试此错误。删除@并查看是否报告了任何错误

只有在随后立即使用error\u get\u last()检查具体故障时,才建议这样做

检查mail()返回值

mail()函数:

返回TRUE如果邮件已成功接受投递,则返回FALSE否则返回。重要的是要注意,仅仅因为邮件被接受交付,并不意味着邮件将实际到达预定目的地

这一点值得注意,因为:

  • 如果您收到FALSE返回值,您知道错误在于服务器接受您的邮件。这可能不是编码问题,而是服务器配置问题。您需要与系统管理员联系以了解发生这种情况的原因
  • 如果您收到TRUE返回值,并不意味着您的电子邮件一定会被发送。这仅仅意味着该电子邮件已通过PHP成功发送到服务器上相应的处理程序。在PHP的控制之外,还有更多的故障点会导致电子邮件无法发送

因此,FALSE将帮助您找到正确的方向,而TRUE并不一定意味着您的电子邮件发送成功。这一点值得注意

确保您的主机提供商允许您发送电子邮件,并且不限制邮件发送

许多共享网络主机,尤其是免费网络主机提供商,要么不允许从其服务器发送电子邮件,要么限制在任何给定时间段内可以发送的邮件量。这是因为他们努力限制垃圾邮件发送者利用他们更便宜的服务

如果您认为您的主机有发送电子邮件的限制或阻止发送电子邮件,请查看他们的常见问题,看看他们是否列出了任何此类限制。否则,您可能需要联系他们的支持人员,以验证是否存在发送电子邮件的任何限制

检查垃圾邮件文件夹;防止电子邮件被标记为垃圾邮件

通常,由于各种原因,通过PHP(和其他服务器端编程语言)发送的电子邮件最终会被放在收件人的垃圾邮件文件夹中。在对代码进行故障排除之前,请始终检查该位置

为了避免通过PHP发送的邮件被发送到收件人的垃圾邮件文件夹中,您可以通过PHP代码和其他方式执行各种操作,以最大限度地减少邮件被标记为垃圾邮件的可能性。Michiel de Mare的好建议包括:

  • 使用电子邮件身份验证方法,如SPF和DKIM,以证明您的电子邮件和您的域名属于一起,并防止欺骗您的域名。SPF网站包含一个向导,用于生成站点的DNS信息
  • 检查反向DNS以确保邮件服务器的IP地址指向用于发送邮件的域名
  • 确保您使用的IP地址不在黑名单上
  • 确保回复地址是有效的现有地址
  • 在收件人字段中使用收件人的全名和真实姓名,而不仅仅是电子邮件地址(例如,“John Smith”lt;[email protected]>
  • 监控您的滥用帐户,例如[email protected][email protected] 这意味着——确保这些账户存在,阅读发送给他们的信息,并对投诉采取行动
  • 最后,让真正轻松退订。否则,您的用户将通过按下“垃圾邮件”按钮取消订阅,这将影响您的声誉

请参阅如何确保以编程方式发送的电子邮件不会自动标记为垃圾邮件?有关此主题的更多信息

确保提供了所有邮件标题

一些垃圾邮件软件会拒绝邮件,如果它缺少常见的标题,如;从「;及;答覆

$headers=array("From:[email protected]&引用;,
&“答复:[email protected]&引用;,
&“X-Mailer:PHP/.PHP”版本
);
$headers=内爆(“\r\n”和“$headers”);
邮件($to、$subject、$message、$headers);

确保邮件标题没有语法错误

无效的头与没有头一样糟糕。一个不正确的字符可能就是使你的电子邮件脱轨的全部原因。仔细检查以确保语法正确,因为PHP不会为您捕获这些错误

$headers=数组[email protected]",//缺少冒号
&“答复:[email protected]",//缺少连字符
&“X-Mailer:“PHP”/“PHP”版本//错误的引号
);

不要使用来自以下发件人的人造代码:sender

虽然邮件必须有From:sender,但不能仅使用任何值。尤其是用户提供的发件人地址是阻止邮件的可靠方法:

$headers=array(“From:$”[contactform\u sender\u email]);//不

原因:您的web或发送邮件服务器未被列入SPF/DKIM白名单,以假装对@hotmail或@gmail地址负责。它甚至可以从以下发件人域以静默方式删除邮件:它未配置为发件人域

确保收件人值正确

有时,问题很简单,比如电子邮件收件人的值不正确。这可能是由于使用了不正确的变量

发表评论