PHP邮件功能无法完成邮件的发送。

php html email


<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com';
    $to = '[email protected]';
    $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代码嵌入其中。该代码可以完美提交,但从不发送电子邮件。我怎样才能解决这个问题?




Answer 1 John Conde


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

有多种原因导致你的脚本似乎无法发送邮件。除非有明显的语法错误,否则很难诊断出这些问题。如果没有,你需要通过下面的检查表来查找你可能遇到的任何潜在陷阱。

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

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

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

请参阅如何在PHP中获得有用的错误消息?— 有关更多详细信息,请参见此答案

确保已调用 mail() 函数

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

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

bool mail(string $to,string $subject,string $message [,string $additional_headers [,string $additional_parameters ]])

邮件功能需要三个必需的参数,还可以选择第四个和第五个参数。如果您对 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的好提示包括:

  • 使用SPFDKIM之类的电子邮件身份验证方法来证明您的电子邮件和您的域名属于同一类别,并防止欺骗您的域名。SPF网站包含一个向导,用于为您的站点生成DNS信息。
  • 检查您的反向DNS,以确保您的邮件服务器指向的IP地址,您用于发送邮件的域名。
  • 确保您使用的IP地址不在黑名单中
  • 确保回复到的地址是一个有效的、现有的地址。
  • 在“收件人”字段中使用收件人的真实姓名,而不仅仅是电子邮件地址(例如 "John Smith" <[email protected]> )。
  • 监控你的滥用账户,如[email protected][email protected]。这意味着----确保这些账户的存在,阅读发送给他们的内容,并根据投诉采取行动。
  • 最后,取消订阅真的很容易。否则,您的用户将通过按垃圾邮件按钮退订,这将影响您的声誉。

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

确保提供了所有的邮件标题

有些垃圾邮件软件会在邮件中缺少常见的标题,如 "发件人 "和 "回信人 "等,就会被拒绝。

$headers = array("From: [email protected]",
    "Reply-To: [email protected]",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);

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

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

$headers = array("From [email protected]", // missing colon
    "Reply To: [email protected]",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

不要使用伪造的 From: 发件人

尽管邮件必须具有“发件人:”发件人,但您不能仅使用任何值。特别是用户拼凑的发件人地址是一种阻止邮件的可靠方法:

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

原因:您的Web或发送邮件服务器未列入SPF / DKIM白名单,以假装负责@hotmail或@gmail地址。它甚至可以自动删除邮件与 From: 它没有配置为发件人域。

确保收件人的值是正确的

有时候,问题很简单,就像邮件收件人的值不正确一样。这可能是由于使用了一个不正确的变量。

$to = '[email protected]';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to

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

mail('[email protected]', $subject, $message, $headers); 

这可以应用于所有 mail() 参数。

发送到多个账户

为了帮助排除电子邮件帐户问题,请将您的电子邮件发送到位于不同电子邮件提供商的多个电子邮件帐户。如果您的电子邮件没有到达用户的Gmail帐户,则将相同的电子邮件发送到Yahoo帐户,Hotmail帐户和常规POP3帐户(例如ISP提供的电子邮件帐户)。

如果邮件全部或部分邮件到达其他邮件账户,说明你知道你的代码正在发送邮件,但很可能是邮件账户提供商由于某种原因阻止了它们。如果邮件没有到达任何一个邮件账户,那么问题很可能与你的代码有关。

确保代码与表单方法匹配

如果将表单方法设置为 POST ,请确保使用 $_POST 查找表单值。如果已将其设置为 GET 或根本没有设置,请确保使用 $_GET 查找表单值。

确保您的表单 action 值指向正确的位置

确保您的表单 action 属性包含一个指向您的PHP邮件代码的值。

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

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

有些虚拟主机提供商不允许或启用通过其服务器发送电子邮件。原因可能会有所不同,但如果他们禁止发送邮件,你需要使用其他方法,使用第三方为你发送邮件。

向他们的技术支持发送电子邮件(在访问他们的在线支持或常见问题之后),应该可以澄清您的服务器上是否有电子邮件功能。

确保已配置 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 中启用这些选项。)

向邮件测试服务机构查询

有各种送达和垃圾邮件检查服务,你可以利用这些服务来测试你的MTAwebserver设置。通常情况下,你发送一个邮件探针到:他们的地址,然后得到一个投递报告和更多的具体故障或分析。

使用不同的邮件

PHP的内置 mail() 函数很方便,通常可以完成工作,但是它有缺点。幸运的是,有一些替代方案可以提供更大的功能和灵活性,包括处理上面概述的许多问题:

这些都可以与专业的SMTP服务器服务提供商结合起来。(因为典型的0815共享虚拟主机计划在邮件设置配置方面的可操作性很差。)




Answer 2 er.irfankhan11


在邮件功能中增加一个邮件标题。

$header = "From: [email protected]\r\n";
$header.= "MIME-Version: 1.0\r\n";
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header.= "X-Priority: 1\r\n";

$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>';
}



Answer 3 sonam gupta


  1. 总是在邮件功能中尝试发送头像。
  2. 如果你是通过localhost发送邮件,那么请进行SMTP设置,以发送邮件。
  3. 如果你是通过服务器发送邮件,那么请检查你的服务器上是否启用了邮件发送功能。



Answer 4 oneDerer


如果您使用SMTP配置发送电子邮件,请尝试使用PHPMailer。您可以从https://github.com/PHPMailer/PHPMailer下载该库。

我创建了我的邮件发送方式是这样的。

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet = "utf-8";
    $mail->IsSMTP();                                      // Set mailer to use SMTP
    $mail->Host = "mail.example.com";  // Specify main and backup server
    $mail->SMTPAuth = true;     // Turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "[email protected]"; // SMTP password

    $mail->From = "[email protected]";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // Set word wrap to 50 characters
    $mail->IsHTML(true);                                  // Set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. <p>";
       echo "Mailer Error: " . $mail->ErrorInfo;
       exit;
    }

    echo "Message has been sent";
}



Answer 5 user1258544


在发送邮件前添加一些标题就可以了。

<?php 
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = '[email protected]'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

还有一件事情。该 mail() 函数没有在本地主机的工作。将您的代码上传到服务器,然后尝试。