<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = 'contact@yoursite.com';
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";
if ($_POST['submit']) {
if (mail ($to, $subject, $body, $from)) {
echo '<p>Your message has been sent!</p>';
} else {
echo '<p>Something went wrong, go back and try again!</p>';
}
}
?>
我试过创建一个简单的邮件表单。表格本身在我的电脑上 index.html
页面,但它会提交到一个单独的“感谢您的提交”页面, thankyou.php
,其中嵌入了上述php代码。代码完全提交,但从不发送电子邮件。我怎样才能解决这个问题?
1条答案
按热度按时间wpcxdonn1#
尽管这个答案有一部分只适用于
mail()
函数本身,其中许多故障排除步骤可以应用于任何php邮件系统。你的脚本似乎不发送电子邮件有多种原因。除非有明显的语法错误,否则很难诊断这些问题。如果没有,你需要浏览下面的清单,找出你可能遇到的任何潜在陷阱。
确保已启用错误报告并设置为报告所有错误
错误报告对于消除代码中的错误和php遇到的一般错误是必不可少的。需要启用错误报告才能接收这些错误。将以下代码放在php文件的顶部(或主配置文件中)将启用错误报告。
查看如何在php中获取有用的错误消息这个答案提供了更多的细节。
确保调用了mail()函数
这可能看起来很愚蠢,但一个常见的错误是忘记实际放置
mail()
在代码中的函数。确保它在那里并且没有被注解掉。确保已正确调用mail()函数
bool mail(字符串$to,字符串$subject,字符串$message[,字符串$additional\u headers[,字符串$additional\u parameters]])
mail函数接受三个必需的参数,还可以选择第四个和第五个参数。如果你打电话给
mail()
如果没有至少三个参数,则会失败。如果你打电话给
mail()
如果没有正确顺序的正确参数,它也将失败。检查服务器的邮件日志
您的web服务器应该记录所有通过它发送电子邮件的尝试。这些日志的位置会有所不同(您可能需要询问服务器管理员它们的位置),但它们通常可以在用户的根目录下找到
logs
. 里面将是服务器报告的错误消息,如果有的话,与您试图发送电子邮件有关。检查端口连接故障
端口阻塞是大多数开发人员在集成代码以使用smtp发送电子邮件时面临的一个非常常见的问题。而且,这可以很容易地在服务器邮件日志中进行跟踪(如上所述,邮件日志的服务器位置可能因服务器而异)。如果您在共享主机服务器上,端口25和587在默认情况下仍然被阻止。此块是由您的主机提供商故意执行的。即使对于某些专用服务器也是如此。当这些端口被阻塞时,请尝试使用端口2525进行连接。如果您发现该端口也被阻止,那么唯一的解决方案是联系您的主机提供商以取消阻止这些端口。
大多数主机提供商都会屏蔽这些电子邮件端口,以保护其网络不发送任何垃圾邮件。
端口25或587用于普通/tls连接,端口465用于ssl连接。对于大多数用户,建议使用端口587以避免某些主机提供商设置的速率限制。
不要使用错误抑制操作符
当错误抑制运算符
@
在php中,任何可能由该表达式生成的错误消息都将被忽略。在某些情况下,使用此运算符是必要的,但发送邮件不是其中之一。如果您的代码包含
@mail(...)
然后,您可能会隐藏重要的错误消息,这将有助于您调试。拆下@
看看有没有报错。只有在你和他核实的时候才是明智的
error_get_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" <john@blacksmiths-international.com>
).监控你的虐待账户,比如abuse@yourdomain.com 以及postmaster@yourdomain.com. 这意味着-确保这些帐户存在,阅读发送给他们的内容,并对投诉采取行动。
最后,让退订变得非常容易。否则,您的用户将通过按垃圾邮件按钮取消订阅,这将影响您的声誉。
了解如何确保以编程方式发送的电子邮件不会自动标记为垃圾邮件?有关此主题的更多信息。
确保提供了所有邮件头
一些垃圾邮件软件会拒绝邮件,如果它缺少常见的标题,如“发件人”和“回复收件人”:
确保邮件头没有语法错误
无效的头和没有头一样糟糕。一个不正确的字符可能是所有需要脱轨您的电子邮件。仔细检查以确保语法正确,因为php不会为您捕获这些错误。
不要使用“发件人”的仿制品
虽然邮件必须有from:sender,但不能仅使用任何值。特别是用户提供的发件人地址是阻止邮件的可靠方法:
原因:你的网站或发送邮件的服务器没有被列入spf/dkim白名单,假装对@hotmail或@gmail地址负责。它甚至可以悄悄地将邮件与
From:
未为其配置发件人域。确保收件人值正确
有时问题很简单,比如电子邮件收件人的值不正确。这可能是由于使用了不正确的变量。
另一种测试方法是将收件人值硬编码到
mail()
函数调用:这适用于所有
mail()
参数。发送到多个帐户
若要帮助排除电子邮件帐户问题,请将电子邮件发送到不同电子邮件提供商的多个电子邮件帐户。如果您的电子邮件没有到达用户的gmail帐户,请将相同的电子邮件发送到yahoo帐户、hotmail帐户和常规pop3帐户(如isp提供的电子邮件帐户)。
如果电子邮件到达所有或部分其他电子邮件帐户,您知道您的代码正在发送电子邮件,但很可能是电子邮件帐户提供商出于某种原因阻止了它们。如果电子邮件没有到达任何电子邮件帐户,则问题更有可能与您的代码有关。
确保代码与表单方法匹配
如果您已将窗体方法设置为
POST
,确保您正在使用$_POST
查找窗体值。如果你把它设置为GET
或者根本没有设置,一定要使用$_GET
查找窗体值。确保表单操作值指向正确的位置
确认你的状态
action
属性包含指向php邮件代码的值。确保web主机支持发送电子邮件
一些网络托管提供商不允许或不允许通过其服务器发送电子邮件。原因可能会有所不同,但如果他们已禁用邮件发送,您将需要使用另一种方法,使用第三方为您发送这些电子邮件。
发送给他们的技术支持的电子邮件(在访问了他们的在线支持或常见问题解答之后)应说明您的服务器上是否提供了电子邮件功能。
确保已配置localhost邮件服务器
如果您正在本地工作站上使用wamp、mamp或xampp进行开发,则您的工作站上可能没有安装电子邮件服务器。如果没有,php就无法发送