2

我一直在研究一个 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.'">'
?>
4

4 回答 4

2

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

于 2013-09-13T16:35:22.317 回答
2

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

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

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 或任何试图通过您的网站发送数千封电子邮件的东西(它发生了!)。
在适当的情况下将它们全部结合使用,您可以确保用户只能输入您允许的数据,并且您可以阻止任何不好的事情发生。

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

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

于 2013-09-13T16:47:00.930 回答
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.'">';
于 2013-09-13T16:40:26.033 回答
1

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

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

一下一$subject$messagetext。现在都在一个标题体内。

另外,你有$headers = 'From: '.$EmailAddress.'/r/n';哪个是无效的。

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

有关该mail()功能的更多信息,请访问 PHP.net onmail() - 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

?>

其他选项:

为了确保有人填写所有字段并且除非他们这样做才发送邮件,那么您可以使用以下内容并确保删除&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 网站上找到

于 2013-09-13T17:28:42.133 回答