【问题标题】:Why doesn't PHP send the email?为什么 PHP 不发送电子邮件?
【发布时间】:2010-07-05 18:16:20
【问题描述】:

我正在尝试发送一封电子邮件,其中包含从 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 页面显示正常,没有产生错误,但我没有收到任何电子邮件。

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

谢谢。

【问题讨论】:

    标签: php forms webforms


    【解决方案1】:

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

    此类失败的更多(不明显)原因通常是:

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

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

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

    每一行应该用一个 低频 (\n)。线不应该更大 超过 70 个字符

    目前您在正文中使用了\r\n,这是不正确的(在某些情况下它可能有效,但它取决于您无法控制的许多事情)。

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

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

    我使用的是Swift MailerPHPMailer

    【讨论】:

      【解决方案2】:

      尝试使用简单的正文发送:

      $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']) 之前添加此内容;然后你可以检查它是否已经到了那么远,你可以检查你的帖子变量

      【讨论】:

      • 嗨蜥蜴,我尝试了这两种方法,但没有运气。我正在运行 Media Temple 的这个,我认为服务器端没有任何遗漏。
      • 在第一次 mail() 调用之前放置一个 echo "test" 以三次检查它是否识别出它是一个提交的表单。例如if (isset($_POST['submitted'])) { echo "testing"; }
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您运行它的机器,是否已配置为发送电子邮件?代码看起来不错,所以可能是配置问题,检查this

        【讨论】:

          【解决方案5】:

          您使用的是 UNIX 系统吗?检查您的系统日志。 PHP 通过将电子邮件交给系统邮件服务来发送电子邮件。在 PHP 可以发送电子邮件之前,您需要确保它正常工作。

          【讨论】:

            【解决方案6】:

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

            【讨论】:

            • 这不是真的,你只需要在 PHP.INI 中有一个有效的 SMTP。
            猜你喜欢
            • 2023-03-08
            • 1970-01-01
            • 1970-01-01
            • 2010-10-17
            • 1970-01-01
            • 2011-09-16
            • 2014-06-13
            • 2017-11-28
            • 2014-08-17
            相关资源
            最近更新 更多