PHP邮件功能没有完成e的发送
<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = 'contact@yoursite.com';
$subject = 'Customer Inquiry';
$body = "From: $namen E-Mail: $emailn 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代码。 代码提交完美,但从未发送电子邮件。 请帮忙。
虽然这个答案的一部分仅适用于mail()
函数本身的使用,但其中许多疑难解答步骤可应用于任何PHP邮件系统。
您的脚本似乎有多种原因不会发送电子邮件。 除非存在明显的语法错误,否则很难诊断这些东西。 没有人,你需要通过下面的清单来找出你可能遇到的任何潜在的陷阱。
确保启用错误报告并设置为报告所有错误
错误报告对于消除代码中的错误以及PHP遇到的一般错误至关重要。 错误报告需要启用以接收这些错误。 将以下代码放置在PHP文件的顶部(或主配置文件中)将启用错误报告。
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
请参阅Stack Overflow答案以获取更多详细信息。
确保调用mail()
函数
它可能看起来很愚蠢,但常见的错误是忘记实际将mail()
函数放入代码中。 确保它在那里并且没有被注释掉。
确保mail()
函数调用正确
bool mail(string $ to,string $ subject,string $ message [,string $ additional_headers [,string $ additional_parameters]])
邮件功能需要三个必需的参数,并可选择第四和第五个参数。 如果您对mail()
调用没有至少三个参数,它将会失败。
如果您对mail()
调用没有正确的顺序参数,它也会失败。
检查服务器的邮件日志
您的Web服务器应该记录所有通过它发送电子邮件的企图。 这些日志的位置会有所不同(您可能需要向服务器管理员询问它们的位置),但通常可以在logs
下的用户根目录中找到它们。 在服务器报告的错误信息中,如果有的话,与您尝试发送电子邮件有关。
检查端口连接失败
端口块是大多数开发人员在集成代码以使用SMTP传递电子邮件时所面临的一个非常普遍的问题。 而且,这可以在服务器maillogs上轻松找到(邮件日志服务器的位置因服务器而异,如上所述)。 如果您使用的是共享托管服务器,则默认情况下,端口25和587将保持阻止状态。 此块已由您的托管服务提供商特意完成。 即使对于一些专用服务器也是如此。 当这些端口被阻止时,尝试使用端口2525进行连接。如果您发现该端口也被阻止,则唯一的解决方法是与您的托管服务提供商联系以解除对这些端口的阻止。
大多数托管提供商阻止这些电子邮件端口,以防止其网络发送任何垃圾邮件。
对于普通/ TLS连接使用端口25或587,对于SSL连接使用端口465。 对于大多数用户,建议使用端口587来避免某些托管服务提供商设置的速率限制。
不要使用错误抑制操作符
当错误抑制运算符@
预先添加到PHP中的表达式中时,可能会由该表达式生成的任何错误消息都将被忽略。 在某些情况下,使用此操作员是必要的,但发送邮件不是其中之一。
如果你的代码包含@mail(...)
那么你可能会隐藏重要的错误消息,这将有助于你进行调试。 删除@
并查看是否有任何错误报告。
只有在事后使用error_get_last()
检查具体故障时才是明智之举。
检查mail()
返回值
mail()
函数:
如果邮件已成功接受投递,返回TRUE
,否则返回FALSE
。 重要的是要注意,仅仅因为邮件被接受发送,并不意味着邮件实际上会到达预定的目的地。
这一点很重要,因为:
FALSE
返回值,您知道错误在于您的服务器接受您的邮件。 这可能不是编码问题,而是服务器配置问题。 您需要与系统管理员联系,以了解发生这种情况的原因。 TRUE
返回值,这并不意味着您的电子邮件肯定会被发送。 它只是意味着电子邮件已被PHP成功发送到服务器上的相应处理程序。 除了PHP的控制之外,还有更多的失败点可能导致邮件无法发送。 所以FALSE
将帮助您指向正确的方向,而TRUE
并不一定意味着您的电子邮件已成功发送。 这点很重要!
确保您的托管服务提供商允许您发送电子邮件并且不限制邮件发送
许多共享虚拟主机,尤其是免费虚拟主机提供商,不允许从服务器发送电子邮件或限制在任何给定时间段内可发送的数量。 这是因为他们努力限制垃圾邮件发送者利用便宜的服务。
如果您认为您的主机已通过电子邮件发送限制或阻止发送电子邮件,请查看其常见问题解答,看看是否列出了任何此类限制。 否则,您可能需要联系他们的支持人员以确认在发送电子邮件时是否存在任何限制。
检查垃圾文件夹; 防止电子邮件被标记为垃圾邮件
通常,由于各种原因,通过PHP(以及其他服务器端编程语言)发送的电子邮件最终会存在于收件人的垃圾邮件文件夹中。 在对您的代码进行故障排除之前,请始终检查。
为了避免通过PHP发送的邮件被发送到收件人的垃圾邮件文件夹,您可以在PHP代码中执行各种操作,否则可能会将您的电子邮件标记为垃圾邮件的机会降至最低。 Michiel de Mare的好建议包括:
"John Smith" <john@blacksmiths-international.com>
)。 请参阅如何确保以编程方式发送的电子邮件不会自动标记为垃圾邮件? 更多关于这个话题。
确保提供了所有邮件标题
如果某些垃圾邮件软件缺少常见标题,如“发件人”和“回复”,则会拒收邮件:
$headers = array("From: from@example.com",
"Reply-To: replyto@example.com",
"X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("rn", $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
);
确保收件人值是正确的
有时候,问题就像电子邮件收件人的值不正确一样简单。 这可能是由于使用了不正确的变量。
$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
查找表单值。
确保Web主机支持发送电子邮件
一些虚拟主机提供商不允许或启用通过他们的服务器发送电子邮件。 原因可能会有所不同,但如果他们已禁用发送邮件,则需要使用另一种方法,使用第三方为您发送这些电子邮件。
发送给他们技术支持的电子邮件(在他们的在线支持或常见问题解答之后)应该澄清您的服务器上是否有电子邮件功能。
确保localhost
邮件服务器已配置
如果您正在使用WAMP,MAMP或XAMPP在本地工作站上开发,则可能未在工作站上安装电子邮件服务器。 没有一个,PHP默认情况下不能发送邮件。
您可以通过安装基本的邮件服务器来解决这个问题 对于Windows,您可以使用免费的Mercury Mail。
您还可以使用SMTP发送您的电子邮件。 从Vikas Dwivedi看到这个伟大的答案,了解如何做到这一点。
启用PHP的自定义mail.log
除了MTA和PHP的日志文件之外,您还可以专门为mail()
函数启用日志记录功能。 它不记录完整的SMTP交互,但至少包含函数调用参数和调用脚本。
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
有关详细信息,请参阅http://php.net/manual/en/mail.configuration.php。 (最好在php.ini
或.user.ini
或.htaccess
启用这些选项。)
使用邮件测试服务进行检查
您可以利用各种交付和垃圾邮件检查服务来测试您的MTA / web服务器设置。 通常,您将邮件探测发送至:他们的地址,然后获得递送报告以及更多具体的失败或分析:
使用不同的邮件程序
PHP的内置mail()
函数非常方便,通常可以完成工作,但它有缺点。 幸运的是,还有其他方法可以提供更多的功能和灵活性,包括处理上述许多问题:
所有这些都可以与专业的SMTP服务器/服务提供商结合使用。 (因为在电子邮件设置/可配置性方面,典型的08/15共享虚拟主机计划遭到了打击或失败。)
在邮件功能中添加邮件标题
$header = "From: noreply@example.comrn";
$header.= "MIME-Version: 1.0rn";
$header.= "Content-Type: text/html; charset=ISO-8859-1rn";
$header.= "X-Priority: 1rn";
$status = mail($to, $subject, $message, $header);
if($status)
{
echo '<p>Your mail has been sent!</p>';
} else {
echo '<p>Something went wrong, Please try again!</p>';
}