[英]PHP Form Email Request Not Bringing form data through
我一直在研究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"> </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变量。 代替$_GET[$ContactName]
,使用$_POST[$ContactName]
。 对所有POSTed变量执行此操作。
一步一步来! 暂时完全忘记电子邮件功能,按顺序进行操作。
制作表格,然后确保它在浏览器中按预期显示。
然后在处理页面(sendform / sendform.php)上,回显所有将从表单发送的数据,以确保它们都在那里,正确存在。
即
print_r($_POST);
然后,一旦您对该阶段感到满意,就可以在电子邮件功能中应用变量并测试最终结果,在需要时进行调整或修复错误等。
但是,目前,您尚未对POSTED数据执行任何操作。 在sendform.php中,您具有以下内容:
$headers = 'From: '.$EmailAddress.'/r/n';
但是,在该文件中没有对它的引用来对其进行设置,也没有将该变量设置为POSTED或GET数据。 因此,它将为空。
您还应该检查错误日志,因为这将显示该变量为空,并导致您回溯到问题所在。 每当使用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'];
重要的提示:
您确实想在发送电子邮件之前验证人们的输入,或者可以敞开心yourself成为垃圾邮件发送者的喜悦。 例如strlen()
来匹配您的表格maxlengths, is_numeric()
和regex来检查其输入的数据不是Javascript就是试图通过您的站点发送数千封电子邮件的东西(它发生了!)。
在适当的情况下,将它们全部结合使用,可以确保用户只能输入您允许的数据,并且可以阻止任何不良情况的发生。
如果有任何错误,请将它们发送回带有错误消息的表单,直到您满意数据可以通过服务器的邮件系统发送然后允许它为止,然后执行此操作。
人们使用您写得不好的代码向全世界发送垃圾邮件只会使您烦恼,无法解决它。 您最终可能会将托管该表单的域名列入黑名单,成为垃圾邮件站点-不好。
我已经修复了您的代码。 在$ 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:
的经过测试的版本,现在显示在电子邮件的适当位置。
一个在$subject
,另一个在$messagetext
。 现在所有这些都位于标题的一个主体中。
另外,您有$headers = 'From: '.$EmailAddress.'/r/n';
这是无效的。
这应该已经读为$headers = 'From: '.$EmailAddress.'\\r\\n';
用\\
代替/
。
可以通过在mail() - here.
上访问PHP.net来阅读有关mail()
函数的更多信息mail() - 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
?>
为了确保有人填写所有字段并且除非他们不发送邮件,否则您可以使用以下内容并确保删除
在您的<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");
}
可以在PHP.net网站上找到有关FILTER_VALIDATE_EMAIL
更多信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.