为什么PHP不发送电子邮件?

时间:2010-07-05 18:16:21

标签: php forms webforms

我正在尝试发送一封包含从html表单收集的数据的电子邮件。

以下是表格:

<form action="estimate.php" action="post">
    <fieldset>
        <input type="text" name="name" value="FULL NAME" onfocus="if (this.value=='FULL NAME') this.value='';"/>
        <input type="text" name="phone" value="PHONE NUMBER" onfocus="if (this.value=='PHONE NUMBER') this.value='';"/>
        <input type="text" name="email" value="EMAIL" onfocus="if (this.value=='EMAIL') this.value='';"/>
        <input type="text" name="date" value="MOVE DATE" onfocus="if (this.value=='MOVE DATE') this.value='';"/>
        <input type="text" name="origin" value="ORIGINATING ADDRESS" onfocus="if (this.value=='ORIGINATING ADDRESS') this.value='';"/>
        <input type="text" name="destination" value="DESTINATION ADDRESS" onfocus="if (this.value=='DESTINATION ADDRESS') this.value='';"/>
        <select name="move-type">
            <option value="" selected="selected">TYPE OF MOVE</option>
            <option value="Private">Private</option>
            <option value="Commercial">Commercial</option>
        </select>
        <input id="quoteSubmit" type="image" src="_images/btn_submit.png" alt="" onmouseover="javascript:this.src='_images/btn_submit-over.png'" onmouseout="javascript:this.src='_images/btn_submit.png'"/>
    </fieldset>
</form>

这是PHP(我在之前的问题帖子中得到了一些帮助):

<html>
<head>
<title>Contact Us</title>
</head>
<body>
<h2>Email Confirmation Page</h2>
<p>This is to prove that something is showing up.</p>
<?php # sends contents of  Free Estimate form

if (isset($_POST['submitted'])) {
$errors = array();

// Check for empty fields

$checkArray = array('name', 'email', 'date', 'origin', 'destination');
foreach($checkArray as $check) {
    if (empty($_POST[$check])) {
        $errors[] = 'Please enter your '.$check;
    } 
}

if (empty($errors)) { // everything is okay

$to = "my@email.com";

    $body = "The following Free Estimate Request has been submitted:\n

        Submitted by: {$_POST['name']}\r
        E-mail: {$_POST['email']}\r
        Phone: {$_POST['phone']}\r
        Move date {$_POST['date']}\r
        Moving from: {$_POST['origin']}\r
        Moving to: {$_POST['destination']}\r
        Move type: {$_POST['move-type']}\r;

    ";

    mail ($to, 'Free Estimate Request', $body, 'From:  '.$from);      

    // end email

} else {    
    echo '<h2>Error!</h2>
    <p class="errors">The following error(s) occurred:<br />';
    foreach ($errors as $msg) {
        echo " - $msg<br />\n";
    }
    echo '</p><p>Please go back and try again.</p><p><br /></p>';
}
};

?>
</body>
</html>

estimate.php页面显示正常,没有生成错误,但我没有收到任何电子邮件。

不确定我在这里缺少什么。

感谢。

6 个答案:

答案 0 :(得分:2)

许多事情可以做到这一点,其中一个是格式错误的电子邮件。如果您不了解RFC /标准,使用PHP mail函数很容易实现。即使mail()返回true(成功),电子邮件也可能永远无法到达目的地。

这种失败的更多(非显而易见的)原因通常是:

额外标题(如Reply-To)必须用\r\n分隔:

  

应该有多个额外的标头   用CRLF分隔(\ r \ n)。

正文中的行必须用\n分隔:

  

每行应用a分隔   LF(\ n)。线条不应该更大   超过70个字符

目前你在身体中使用\r\n是不正确的(在某些情况下它可能会起作用,但它取决于你手中的很多东西)。

其他原因可能是缺少Reply-To标题或甚至配置错误MX records,这使得您使用PHP发送的所有电子邮件都是垃圾邮件。

最好(也是最简单)的解决方案IMHO将停止使用PHP邮件功能并切换到可以生成格式正确的邮件的库。这样您就不必学习所有棘手的RFC,并且如果您使用一个好的库,您的代码会更安全(请阅读email injection attacks)。

我使用的是Swift MailerPHPMailer

答案 1 :(得分:1)

尝试使用简单的身体发送:

$body = "The following Free Estimate Request has been submitted:\n";

看看它是否发送。

还可以尝试一个基本的电子邮件:

mail ($to, 'Free Estimate Request', 'This is my body', 'From:  '.$from);

还可以尝试更改不同的电子邮件地址并检查垃圾文件夹。

当然要确保有一台运行的SMTP服务器

<强>更新

您可能还想:

echo "<pre>";
print_r($_POST);
echo "</pre>";

isset($_POST['submitted'])之前添加此内容;然后你可以检查一下它是否走得那么远,你可以查看你的帖子

答案 2 :(得分:0)

您是否检查了mail()的返回值,看它是否成功了?此外,SMTP服务器需要与Web服务器在同一台计算机上运行才能成功进行此调用。

答案 3 :(得分:0)

您运行此操作的计算机是否已配置为发送电子邮件?代码看起来很好,所以可能是配置问题,请检查this

答案 4 :(得分:0)

您是否在UNIX系统上?检查系统日志。 PHP通过将其发送到系统邮件服务来发送电子邮件。在PHP发送电子邮件之前,您需要确保它正常工作。

答案 5 :(得分:0)

您是否从本地服务器运行?您需要进行DNS设置才能发送电子邮件...