<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = 'contact@yoursite.com'; 
    $subject = 'Customer Inquiry';
    $body = "From: $name
 E-Mail: $email
 Message:
 $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 代码。代码提交完全,但永远不会发送电子邮件。请帮助。

2014-07-09 02:18:55
问题评论:

是您的程序在本地计算机或活动的主机

1.您确实不会进入您的垃圾邮件吗?2.您有在您的机器上配置的 sendmail 吗?

它也不会到我的垃圾邮件活动主机上.我不敢肯定您通过使用 sendmail 在我中配置,因此我不认为说的是什么?

回答:

有多种原因,您的脚本看起来不会发送电子邮件。很难诊断这些事情,除非有明显的语法错误。没有,您需要运行下面查找任何可能遇到的潜在缺陷的清单。

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

错误报告是不可或缺的找出在 PHP 中遇到常规错误和代码中的 bug。错误报告需要启用要接收到这些错误。将下面的代码放置在顶部的 PHP 文件 (或一个主配置文件),则将启用错误报告功能。

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

对此,请参阅此堆栈溢出回答有关更多详细信息。

  • 确保实际调用mail()函数

它可能看起来有点傻,但一个常见的错误就是忘记实际放置在代码中的mail()函数。请确认它存在并不注释掉。

  • 请检查您的服务器的邮件日志

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

  • 不要使用错误抑制运算符

错误抑制运算符 @预置为 PHP 中的表达式时,该表达式可能会生成任何错误消息将被忽略。某些情况下使用此运算符是必需,但发送邮件是其中之一。

如果您的代码中包含@mail(...)然后您可以隐藏重要错误消息可帮助您调试它。删除@ ,并查看是否报告任何错误。

其时,才建议您咨询error_get_last()适合以后具体故障。

  • 请检查以确定是否 mail () 返回 true 或 false

mail()函数中︰

返回TRUE如果邮件已成功接受传送,FALSE否则。值得注意的是,仅仅因为等待传递的邮件被接受,并不意味着邮件实际将达到预定的目标。

这一点很重要,因为︰

  1. 如果您收到一个FALSE的返回值,您知道该错误位于与接受您的邮件服务器。这可能不是一个编码的问题,但服务器配置问题。您需要与您的系统管理员联系,以了解为何出现这情况沟通。
  2. 如果您收到返回TRUE值并不意味着肯定会发送您的电子邮件。它只是电子邮件发送到其各自的处理程序在服务器上成功地通过 PHP。有仍然更多的外部 PHP 的控制可能会导致电子邮件不会发送故障点。

因此FALSE将帮助您在正确的方向而TRUEdoes一定意味着您的电子邮件已成功发送。这是一定要注意 !

  • 请检查您的垃圾邮件文件夹/防止您的电子邮件被标记为垃圾邮件

通常,由于各种原因的电子邮件发送通过 PHP (和其他服务器端编程语言) 最终在收件人的垃圾邮件文件夹中。总是在那里检查诊断代码之前。

为了避免被发送到收件人的垃圾邮件文件夹从通过 PHP 发送邮件,有可以执行的两者在 PHP 代码中的各种操作,否则,尽量减少机会您的电子邮件标记为垃圾邮件。Michiel de Mare的好技巧包括︰

  • 使用电子邮件身份验证方法,例如SPFDKIM证实您的电子邮件和您的域名属于在一起,并防止欺骗的域名称。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("
", $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 帐户,雅虎帐户、 的 Hotmail 帐户,和常规的 POP3 帐户 (如您的 ISP 提供的电子邮件帐户) 发送相同的电子邮件。

如果电子邮件到达时在所有或某些其他电子邮件帐户,您知道您的代码在发送电子邮件,但很可能该电子邮件帐户提供程序阻碍它们由于某种原因。如果电子邮件没有到达所有电子邮件帐户,则问题是更有可能与您的代码。

  • 请确保您发送电子邮件的 Web 主机支持

某些 Web 宿主提供程序不允许,也使他们的服务器通过电子邮件发送。此问题的原因可能不同,但如果它们已禁用发送的邮件您将需要使用另一种方法方法,使用第三方为您发送的电子邮件。

如果电子邮件功能的服务器上可用,应阐明 (后到他们的在线支持或常见问题的行程) 及其技术支持的电子邮件。

  • 如果在localhost,请确保邮件服务器设置

如果您要使用 WAMP、 MAMP 或 XAMPP 在本地工作站上开发的在您的工作站上可能未安装电子邮件服务器。没有,PHP 不能默认情况下发送邮件。

您可以通过安装一个基本的邮件服务器来解决这一问题。对于 Windows,您可以使用免费的水星邮件.

您还可以使用 SMTP 发送电子邮件。请参阅此答得好 Vikas Dwivedi若要了解如何执行此操作。

  • 启用 PHPs 自定义mail.log

除了您 Mta 和 PHPs 日志文件,您可以启用日志记录的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或许。)

  • 请考虑使用替代的发件人

PHP 的内置的mail()函数是很方便的和经常获取完成这项工作,但它也有其缺点幸运的是没有提供更多的功能和灵活性包括处理上面所述的问题很多的备选方案。就可以考虑使用的其中一个是受欢迎的PHPMailerSwiftMailer或甚至旧PEAR::Mail.

请参阅堆栈溢出文档︰

写得好,约翰。我只是将一件事情︰ 检查邮件服务器日志发送邮件托管的服务器 (是否它是本地或远程),如果可能的话,可以经常搞清楚是什么原因导致该问题。这些日志应该显示 1) 从 PHP 脚本发送邮件服务器接收消息,如果是这样,2) 接收 MX 接受从发送邮件服务器的传递。

是很有帮助,我很惊讶我错过了它的 @mti2935。我将确保添加它,它很快。:)

这有一个,如果不是您最大和最详细的答案; 是 + 1;) 我见过Molto 时 !

Gratzi !我认为您说的没错,这是我最大的和最详细的答案。我是比较惊讶,我们已经没有这样的答复。经常说。

Aahhh prego amico mio。我提供了它在我的个人资料作为值得链接;) ciao 为 niao;我的意思是"现在";)(记住标记我),没有看到此 lol

在邮件功能中添加邮件标头

$header = "From: noreply@example.com
"; 
$header.= "MIME-Version: 1.0
"; 
$header.= "Content-Type: text/html; charset=ISO-8859-1
"; 
$header.= "X-Priority: 1
"; 

mail($to, $subject, $message, $header);
  1. 总是尝试发送邮件功能中的标头。
  2. 如果您要发送到本地主机的邮件然后执行用于发送邮件的 smtp 设置。
  3. 如果您要发送到服务器的邮件然后检查您的服务器上启用了电子邮件发送功能。

您正在发送您的电子邮件使用 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 = "p@ssw0rd"; // SMTP password

    $mail->From = "me@walalang.com";
    $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";
}

我还不得不使用︰ require("phpmailer/class.smtp.php");

它从事我的 000webhost 方法如下︰

$headers  = "MIME-Version: 1.0" . "
";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "
";
$headers .= "From: ". $from. "
";
$headers .= "Reply-To: ". $from. "
";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "
"; 

直接输入的电子邮件地址,发送电子邮件时

mail('email@gmail.com', $subject, $message, $headers)

使用''并不""

此代码可以正常工作,但半小时延误收到电子邮件

内容来源于Stack Overflow PHP mail form doesn't complete sending e-mail
请输入您的翻译

PHP mail form doesn't complete sending e-mail

确认取消