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

pkwftd7m  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(495)
<?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代码。代码完全提交,但从不发送电子邮件。我怎样才能解决这个问题?

wpcxdonn

wpcxdonn1#

尽管这个答案有一部分只适用于 mail() 函数本身,其中许多故障排除步骤可以应用于任何php邮件系统。
你的脚本似乎不发送电子邮件有多种原因。除非有明显的语法错误,否则很难诊断这些问题。如果没有,你需要浏览下面的清单,找出你可能遇到的任何潜在陷阱。

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

错误报告对于消除代码中的错误和php遇到的一般错误是必不可少的。需要启用错误报告才能接收这些错误。将以下代码放在php文件的顶部(或主配置文件中)将启用错误报告。

error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");

查看如何在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. 这意味着-确保这些帐户存在,阅读发送给他们的内容,并对投诉采取行动。
最后,让退订变得非常容易。否则,您的用户将通过按垃圾邮件按钮取消订阅,这将影响您的声誉。
了解如何确保以编程方式发送的电子邮件不会自动标记为垃圾邮件?有关此主题的更多信息。

确保提供了所有邮件头

一些垃圾邮件软件会拒绝邮件,如果它缺少常见的标题,如“发件人”和“回复收件人”:

$headers = array("From: from@example.com",
    "Reply-To: replyto@example.com",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);

确保邮件头没有语法错误

无效的头和没有头一样糟糕。一个不正确的字符可能是所有需要脱轨您的电子邮件。仔细检查以确保语法正确,因为php不会为您捕获这些错误。

$headers = array("From from@example.com", // missing colon
    "Reply To: replyto@example.com",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

不要使用“发件人”的仿制品

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

$headers = array("From: $_POST[contactform_sender_email]"); // No!

原因:你的网站或发送邮件的服务器没有被列入spf/dkim白名单,假装对@hotmail或@gmail地址负责。它甚至可以悄悄地将邮件与 From: 未为其配置发件人域。

确保收件人值正确

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

$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to

另一种测试方法是将收件人值硬编码到 mail() 函数调用:

mail('user@example.com', $subject, $message, $headers);

这适用于所有 mail() 参数。

发送到多个帐户

若要帮助排除电子邮件帐户问题,请将电子邮件发送到不同电子邮件提供商的多个电子邮件帐户。如果您的电子邮件没有到达用户的gmail帐户,请将相同的电子邮件发送到yahoo帐户、hotmail帐户和常规pop3帐户(如isp提供的电子邮件帐户)。
如果电子邮件到达所有或部分其他电子邮件帐户,您知道您的代码正在发送电子邮件,但很可能是电子邮件帐户提供商出于某种原因阻止了它们。如果电子邮件没有到达任何电子邮件帐户,则问题更有可能与您的代码有关。

确保代码与表单方法匹配

如果您已将窗体方法设置为 POST ,确保您正在使用 $_POST 查找窗体值。如果你把它设置为 GET 或者根本没有设置,一定要使用 $_GET 查找窗体值。

确保表单操作值指向正确的位置

确认你的状态 action 属性包含指向php邮件代码的值。

<form action="send_email.php" method="POST">

确保web主机支持发送电子邮件

一些网络托管提供商不允许或不允许通过其服务器发送电子邮件。原因可能会有所不同,但如果他们已禁用邮件发送,您将需要使用另一种方法,使用第三方为您发送这些电子邮件。
发送给他们的技术支持的电子邮件(在访问了他们的在线支持或常见问题解答之后)应说明您的服务器上是否提供了电子邮件功能。

确保已配置localhost邮件服务器

如果您正在本地工作站上使用wamp、mamp或xampp进行开发,则您的工作站上可能没有安装电子邮件服务器。如果没有,php就无法发送

相关问题