PHP表单电子邮件请求不通过表单数据

时间:2013-09-13 16:30:58

标签: php html forms email

我一直在处理一个php脚本和一个html表单(都在单独的文件中),它从表单中获取数据并通过电子邮件发送给我。我很难获得用户通过电子邮件填写的表单数据。 我希望该电子邮件能够将用户的电子邮件包含在电子邮件中作为From。

任何人都可以帮我弄清楚文件有什么问题吗?

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.'">'
?>

4 个答案:

答案 0 :(得分:2)

您在表单中使用POST,但您没有引用帖子变量。而不是$_GET[$ContactName],请使用$_POST[$ContactName]。对所有POST变量执行此操作。

答案 1 :(得分: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或任何试图通过您的网站发送数千封电子邮件(它发生!)。
在适当的时候将它们全部相互结合使用,可以确保用户只能输入您允许的数据,并且可以阻止任何不良事件发生。

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

使用您编写的代码严重垃圾邮件的人们不会对您必须解决这个问题感到烦恼。您最终可能会将您的域名作为垃圾网站列入黑名单 - 不好。

答案 2 :(得分:1)

我修复了你的代码。在$ 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.'">';

答案 3 :(得分:1)

以下是已测试的版本,其中From:现已显示在电子邮件的相应位置。

  • 快速注意:有两个单独的标题正文破坏了您的代码。

一个在$subject之下,另一个在$messagetext之上。现在所有这些都在标题内部。

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

这应该被视为$headers = 'From: '.$EmailAddress.'\r\n';\而不是/

有关mail()功能的更多信息,请访问mail() - here.

上的PHP.net

工作代码

<?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

?>

其他选项:

要确保有人填写所有字段而不发送邮件,那么您可以使用以下内容并确保删除&nbsp;中的<textarea name="Message"...,因为这被视为输入

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网站