我已经在许多php电子邮件脚本上来回使用,甚至购买了Formtoemailpro(http://formtoemail.com/),现在我正在使用这个。我最终收到了来自此脚本(和f2ep)的一封电子邮件,但它只发送了标签和部分名称以及电子邮件地址,而不是其他任何字段。当我检查回声时,确实知道每个变量应被定义为什么。
我正在使用dreamhost作为我的托管计划。我在尝试的每个脚本上都得到类似的结果 - 如果有的话,会显示电子邮件中的一个或多个字段。我用来测试的电子邮件是我个人的Gmail帐户,但我的客户想要使用的电子邮件是他们使用新域/托管设置的电子邮件 - 我相信它是一个谷歌应用程序帐户。
我有什么基本的错误吗? 我也愿意改进脚本。
HTML:
<form name="form1" id="form1" method="post" action="formtest.php">
<span class="formtext">
<p>
<label for="nameFirst">First Name:</label>
<input type="text" name="nameFirst" id="nameFirst" />
</p>
<p>
<label for="nameLast">Last Name:</label>
<input type="text" name="nameLast" id="nameLast" />
</p>
<p>
<label for="email">E-mail: </label>
<input type="text" name="email" id="email" />
</p>
<p>
<label for="phone"> Phone:</label>
<input type="text" name="phone" id="phone" />
</p>
<p>
<label for="subject">Reason for contacting us?</label>
<br />
<select name="subject" id="subject">
<option>Request more information</option>
<option>Recommend a project</option>
<option>Suggest a resource</option>
<option>Get us to help a community</option>
</select>
</p>
<p>
<label for="messagebox" class="formtext">Message:</label>
<br>
<textarea name="messagebox" id="messagebox" cols="45" rows="5"></textarea>
</p>
<p>
<input type="submit" name="submit" id="button" value="Send" />
</p>
</span>
</form>
PHP:
<?php
$to = "foo@example.com";
$subject = $_POST['subject'];
$name = $_POST['nameFirst'].$_POST['nameLast'];
$phone = $_POST['phone'];
$email = $_POST['email'];
$message = $_POST['messagebox'];
if(isset($_POST['submit'])) {
$body = "From: {$name}\n Phone: {$phone}\n E-Mail: {$email}\n Message:\n {$message}";
$headers = "From: ". $name . " <" . $email . ">\r\n";
$headers .= "Reply-To:". $email ."\r\n";
mail($to, $subject, $body, $headers);
// redirect
header('Location: ThankYouContact.html');
}
// Error Checking http://bit.ly/NDhVrm
/* if (@mail($to, $subject, $message)) { //@ suppresses error msg
echo('<p>Mail sent successfully.</p>');
} else {
echo('<p>Mail could not be sent.</p>');
} */
// Function to validate against any email injection attempts
function IsInjected($str)
{
$injections = array('(\n+)',
'(\r+)',
'(\t+)',
'(%0A+)',
'(%0D+)',
'(%08+)',
'(%09+)'
);
$inject = join('|', $injections);
$inject = "/$inject/i";
if(preg_match($inject,$str))
{
return true;
}
else
{
return false;
}
}
?>
答案 0 :(得分:3)
您的代码存在一定的风险 - 在使用它们之前,您不会测试所有这些$ _POST值的存在,这可能导致PHP输出警告消息。如果输出了这些警告,则header()
重定向将失败,并显示headers already sent
错误。
要检查的一些事项:
a)mail()
的返回值。现在你假设它成功了。你应该测试一个布尔值false,表明PHP和SMTP服务器之间爆炸了。
b)如果dreamhost允许或者可以提供它,请检查邮件服务器日志以查看PHP移交电子邮件后发生的情况 - 记住,PHP的邮件()相当于在信箱中丢弃信封 - 它实际上没有发送邮件。
c)您可能需要考虑切换到PHPMailer或SwiftMailer,这样可以在出现问题时为您提供更好的诊断信息。
d)您应该执行if ($_SERVER['REQUEST_METHOD'] == 'POST') { ... }
而不是检查表单字段。 REQUEST_METHOD是100%可靠的,而检查formfields取决于你没有改变任何东西。