【问题标题】:PHP Form Email Request Not Bringing form data throughPHP表单电子邮件请求未通过表单数据
【发布时间】:2013-09-18 10:08:56
【问题描述】:

我一直在研究一个 php 脚本和一个 html 表单(都在单独的文件中),它们从表单中获取数据并将其通过电子邮件发送给我。我很难获取用户填写的表单数据以通过电子邮件发送。 我希望电子邮件包含用户的电子邮件作为电子邮件中的发件人。

谁能帮我弄清楚文件有什么问题?

HTML 表单:

<form id="ContactUs" name="ContactUs" method="post" action="sendform/sendform.php">    
<table width="60%" border="0" cellpadding="2px" style="position:relative; left:20%">
<tr>
<td width="25%" align="right">Name:</td>
<td width="75%" align="left"><input name="ContactName" type="text" size="40" maxlength="100" /></td>
</tr>
<tr>
<td align="right">Email Address:</td>
<td align="left"><span id="sprytextfield1">
<input name="EmailAddress" type="text" id="EmailAddress" size="40" maxlength="150" />
<span class="textfieldRequiredMsg">A value is required.</span></span></td>
</tr>
<tr>
<td align="right">Phone Number:</td>
<td align="left"><span id="sprytextfield2">
<label for="PhoneNumber"></label>
<input name="PhoneNumber" type="text" id="PhoneNumber" maxlength="15" />
<span class="textfieldRequiredMsg">A value is required.</span></span></td>
</tr>
<tr>
<td align="right">Practice Name:</td>
<td align="left"><input name="PracticeName" type="text" size="40" maxlength="100" /></td>
</tr>
<tr>
<td align="right">Message:</td>
<td align="left"><textarea name="Message" cols="40" rows="10">&nbsp;</textarea></td>
</tr>
<tr>
<td align="center" width="25%"></td>
<td align="center" width="75%"><input name="SubmitForm" type="submit" id="SubmitForm" onclick="MM_popupMsg('Are you sure you would like to submit this form?\r');return document.MM_returnValue" value="Submit Form" /><input type="reset" name="ResetForm" id="ResetForm" value="Reset Form" /></td>
</table>
</form>

名为 sendform.php 的单独 PHP 文件

<?php
// Where to redirect after form is processed. 
$url = 'ThankYou.php';


// multiple recipients
$to  = 'T@domain.com'; 

// subject
$subject = 'Someone sent you a contact request';

$headers = 'From: '.$EmailAddress.'/r/n';
$headers .= 'MIME-Version: 1.0\r\n';
$headers .= 'Content-Type: text/html; charshet=ISO-8859-1\r\n';






// message
$messagetext = '<html><body>';
$messagetext .= '  <p>Website Form Submit</p>';
$messagetext .= '    <table>';
$messagetext .= '        <tr><td align="right">Name:</td><td>'; $_GET[$ContactName] .'</td></tr>';
$messagetext .= '        <tr><td align="right">Email Address:</td><td align="left">'; $EmailAddress .'</td></tr>';
$messagetext .= '        <tr><td align="right">Phone Number:</td><td align="left">'; $PhoneNumber .'</td></tr>';
$messagetext .= '        <tr><td align="right">Practice Name:</td><td align="left">'; $PracticeName .'</td></tr>';
$messagetext .= '        <tr><td align="right">Message:</td><td align="left">'; $Message .'</textarea></td></tr>';
$messagetext .= '  </table></body></html>'; 

// To send HTML mail, the Content-type header must be set
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";


// Mail it
mail($to, $subject, $messagetext, $headers);
//echo $message;
echo '<META HTTP-EQUIV=Refresh CONTENT="0; URL='.$url.'">'
?>

【问题讨论】:

  • 您在表单中使用 POST,但没有引用 post 变量。
  • 这是在您自己的服务器上运行,还是在托管服务器上运行?你可以给自己发一封简单的邮件吗?您是否能够向自己“发件人”这些地址之一发送一封简单的邮件?提交表单时是否收到错误消息?
  • @Andy Gee 很到位。看起来您也尝试使用 $_GET 而不是 $_POST。例如,要引用您的联系人姓名,您可以使用 $_POST['ContactName']
  • 这个,一方面会彻底“碰壁”$headers = 'From: '.$EmailAddress.'/r/n'; - 使用\r\n,如$headers = 'From: '.$EmailAddress.'\r\n';,而这将是另一个@987654326 @ - 不结束分号 - 使用 echo '&lt;META HTTP-EQUIV=Refresh CONTENT="0; URL='.$url.'"&gt;';
  • 另一件事,这个$headers .= 'Content-Type: text/html; charshet=ISO-8859-1\r\n'; charshet,而是charset,如$headers .= 'Content-Type: text/html; charset=ISO-8859-1\r\n';

标签: php html forms email


【解决方案1】:

这是一个测试版本,From: 现在显示在电子邮件的适当位置。

  • 快速说明:有两个单独的标头正文破坏了您的代码。

一个在$subject 之下,另一个在$messagetext 之上。现在都在一个标题正文中。

另外,您的 $headers = 'From: '.$EmailAddress.'/r/n'; 无效。

这应该读作$headers = 'From: '.$EmailAddress.'\r\n';\ 而不是/

更多关于mail()函数的信息可以通过访问PHP.netmail() - here.阅读

工作代码

<?php
$url = 'ThankYou.php';

$ContactName = $_POST['ContactName'];
$EmailAddress = $_POST['EmailAddress'];
$PhoneNumber = $_POST['PhoneNumber'];
$Message = $_POST['Message'];
$PracticeName = $_POST['PracticeName'];

$to  = "email@example.com";
$subject = 'Someone sent you a contact request';

// message
$messagetext = '<html><body>';
$messagetext .= '  <p>Website Form Submit</p>';
$messagetext .= '  <table>';
$messagetext .= '  <tr><td align="right">Name:</td><td>'.$ContactName.'</td></tr>';
$messagetext .= '  <tr><td align="right">Email Address:</td><td align="left">'.$EmailAddress.'</td></tr>';
$messagetext .= '  <tr><td align="right">Phone Number:</td><td align="left">'.$PhoneNumber.'</td></tr>';
$messagetext .= '  <tr><td align="right">Practice Name:</td><td align="left">'.$PracticeName.'</td></tr>';
$messagetext .= '  <tr><td align="right">Message:</td><td align="left">'.$Message.'</textarea></td></tr>';
$messagetext .= '  </table></body></html>'; 

// To send HTML mail, the Content-type header must be set
$headers = "MIME-Version: 1.0\n";
$headers .= "Content-Type: text/html; charset=iso-8859-1\n";
$headers .= "From: $EmailAddress" . "\r\n" .
            "Reply-To: $EmailAddress" . "\r\n" .
            'X-Mailer: PHP/' . phpversion();

// Mail it
mail($to, $subject, $messagetext, $headers);
//echo $message;
echo '<META HTTP-EQUIV=Refresh CONTENT="0; URL='.$url.'">';

//echo "Success"; // my testing method

?>

其他选项:

要确保有人填写了所有字段并且除非他们这样做,否则不会发送邮件,那么您可以使用以下内容并确保删除 &lt;textarea name="Message"... 中的 &amp;nbsp;,因为这被视为输入。

if(!empty($_POST['EmailAddress']) && (!empty($_POST['ContactName']))

 && (!empty($_POST['PhoneNumber']))

 && (!empty($_POST['PracticeName']))

 && (!empty($_POST['Message']))

)

{

mail($to, $subject, $messagetext, $headers);
//echo $message;
// echo '<META HTTP-EQUIV=Refresh CONTENT="0; URL='.$url.'">';

echo "Success";

}

else {

echo "Mail failed. All fields must be filled.";

}

还有更多可以做的改进,例如电子邮件验证,例如FILTER_VALIDATE_EMAIL

例子:

$email = $_POST['EmailAddress'];
if(empty($_POST['EmailAddress']) || !filter_var($EmailAddress, FILTER_VALIDATE_EMAIL)) {

    die("Please enter a valid email");

}

有关FILTER_VALIDATE_EMAIL 的更多信息,请访问 PHP.net 网站

【讨论】:

    【解决方案2】:

    一步一个脚印!暂时忘记电子邮件功能,按顺序做事。

    制作表单,然后确保它在浏览器中按预期显示。
    然后在处理页面 (sendform/sendform.php) 上,回显将从表单发送的所有数据,以确保它们都在那里,存在并且正常。

    print_r($_POST);
    

    然后,一旦您对该阶段感到满意,您就可以在电子邮件功能中应用变量并测试最终结果,在需要的地方进行调整或修复错误等。

    但是,目前,您没有对 POSTed 数据做任何事情。在 sendform.php 中,你有这个:

    $headers = 'From: '.$EmailAddress.'/r/n';
    

    但是,在该文件中没有引用它来设置它,或者将该变量设置为 POSTed 或 GET 数据。因此,它将是空的。
    你也应该检查你的错误日志,因为这会告诉你这个 var 是空的,并引导你回到你的问题。每当使用 PHP 进行编码时,错误日志都是必须的,即使对于专业人士也是如此。

    你也有这个:

    $messagetext .= '<tr><td align="right">Name:</td>
                     <td>'; $_GET[$ContactName] .'</td></tr>
                    ';
    

    您的表单设置为 POST 数据,而不是 GET。

    所以您的数据存储在 PHP 的 $_POST 数组中。因此,使用您的表单名称,电子邮件地址将是:

    $_POST['EmailAddress'];
    // You can use this, or set it to a variable, ie
    $EmailAddress = $_POST['EmailAddress'];
    

    重要提示:
    您真的想在发送电子邮件之前验证人们的输入,或者您可以打开自己成为垃圾邮件发送者的喜悦。例如 strlen() 匹配您的表单 maxlengths、is_numeric() 和正则表达式来检查他们输入的数据不是一些 Javascript 或任何试图通过您的网站发送数千封电子邮件的东西(它发生了!)。
    在适当的情况下将它们全部结合使用,您可以确保用户只能输入您允许的数据,并且您可以阻止任何不好的事情发生。

    如果有任何错误,请将它们发送回表单并显示错误消息,直到您满意数据可以通过您的服务器的邮件系统发送,然后允许发送为止。

    人们使用你写得不好的代码向世界发送垃圾邮件不会只是让你不得不解决这个问题的烦恼。您最终可能会将托管表单的域名作为垃圾邮件站点列入黑名单 - 不好。

    【讨论】:

    • 你提到了$headers = 'From: '.$EmailAddress.'/r/n';,但是你没有提到/r/n是无效的,它应该读作$headers = 'From: '.$EmailAddress.'\r\n';
    • 有很多事情我没有提到。错误,改进,我觉得更好的方法......有人问我为什么表格没有带来数据,我回答并给出了(我认为)对此的详细解释。老实说,与其一直从其他人的答案中挑剔,为什么不发布自己的答案?
    • 是的,确实有很多错误和改进空间,这是肯定的。事实上,我确实发布了一个answer,我在发布之前对其进行了全面测试。我总是在提交之前测试我的答案,这样我就有了一些证据来支持我的“布丁”;-) 干杯
    • 是的,但我们不是来为人们编写代码,或者告诉他们每一步出了什么问题。我可以声明脚本应该在一个函数或类中,以便在需要时可以在多个脚本上定义、验证和重用它。一个人可以永远继续下去,从长远来看,提供完整的代码对提问者没有帮助。他们需要指针,就像我一样,他们可以从编写自己的代码中学习,然后提出代码特定的问题。不过不用担心。当然,你能给他一个工作的、经过测试的脚本,从你自己的时代开始! :)
    • 詹姆斯在所有这些观点上都是对的。除了指出错误之外,我们别无他法,如果可能的话,提供工作代码,当它不是“繁重的负载”时,我喜欢这样做。
    【解决方案3】:

    我已经修复了你的代码。在 $to 变量中输入您要发送电子邮件的电子邮件。

    <?php
    $ContactName = $_POST['ContactName'];
    $EmailAddress = $_POST['EmailAddress'];
    $PhoneNumber = $_POST['PhoneNumber'];
    $Message = $_POST['Message'];
    $PracticeName = $_POST['PracticeName'];
    
    $to = 'ENTER EMAIL ADDRESS ON WHICH YOU WANT TO SEND EMAIL';
    
    $subject = 'Someone sent you a contact request';
    
    $headers = 'From: '.$EmailAddress.'/r/n';
    $headers .= 'MIME-Version: 1.0\r\n';
    $headers .= 'Content-Type: text/html; charshet=ISO-8859-1\r\n';
    
    // message
    $messagetext = '<html><body>';
    $messagetext .= '  <p>Website Form Submit</p>';
    $messagetext .= '    <table>';
    $messagetext .= '        <tr><td align="right">Name:</td><td>'.$ContactName.'</td></tr>';
    $messagetext .= '        <tr><td align="right">Email Address:</td><td align="left">'.$EmailAddress.'</td></tr>';
    $messagetext .= '        <tr><td align="right">Phone Number:</td><td align="left">'.$PhoneNumber.'</td></tr>';
    $messagetext .= '        <tr><td align="right">Practice Name:</td><td align="left">'.$PracticeName.'</td></tr>';
    $messagetext .= '        <tr><td align="right">Message:</td><td align="left">'.$Message.'</textarea></td></tr>';
    $messagetext .= '  </table></body></html>'; 
    
    // To send HTML mail, the Content-type header must be set
    $headers  = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1'."\r\n";
    
    
    // Mail it
    mail($to, $subject, $messagetext, $headers);
    //echo $message;
    echo '<META HTTP-EQUIV=Refresh CONTENT="0; URL='.$url.'">';
    

    【讨论】:

    • 此代码有效。唯一没有的是 From: 部分没有将他们的电子邮件地址放入...
    • Iqbal 很高兴发布您的整个代码,其中包含建议的修复等 [我没有检查他们发布的内容],但是您需要通过自己编写代码来了解他们做了什么以及为什么。否则,你将永远被困在向其他人索要脚本 :)
    • @tgbrunet 那是因为$headers = 'From: '.$EmailAddress.'/r/n'; 中的/r/n 将其更改为$headers = 'From: '.$EmailAddress.'\r\n';,理论上它应该可以工作。伊克巴尔没有做出适当的改变。
    • 这个$headers .= 'Content-Type: text/html; charshet=ISO-8859-1\r\n'; 将失败。不是charshet,而是charset
    【解决方案4】:

    您在表单中使用了 POST,但没有引用 post 变量。代替$_GET[$ContactName],使用$_POST[$ContactName]。对所有 POST 变量执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多