我已经用这个来回使用了许多php电子邮件脚本,甚至购买了Formtoemailpro(http://formtoemail.com/),现在我正在使用这个。我最终确实收到了来自此脚本(和 f2ep)的一封电子邮件,但它只发送了标签以及部分名称和电子邮件地址,而不是任何其他字段。当我用回声检查时,它确实知道每个变量应该被定义为什么。
我正在使用梦想主机作为我的托管计划。我在尝试的每个脚本上都得到了类似的结果 - 如果有的话,电子邮件中的一个或多个字段都会显示。我一直用来测试的电子邮件是我的个人Gmail帐户,但我的客户想要使用的电子邮件是他们使用新域/托管设置的电子邮件 - 我相信这是一个Google应用程序帐户。
我有什么基本的东西弄错了吗?我也愿意对脚本进行改进。
.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;
}
}
?>
您的代码有些风险 - 在使用它们之前,您不会测试所有这些 $_POST 值是否存在,这可能会导致 PHP 输出警告消息。如果输出这些警告,则header()
重定向将失败并显示通常的headers already sent
错误。
要检查的一些事项:
a) mail()
的返回值。现在你假设它成功了。你应该测试一个布尔值 false,表示 PHP 和 SMTP 服务器之间发生了一些问题。
b) 如果 dreamhost 允许或可以提供它,请检查邮件服务器日志,看看 PHP 交出电子邮件后会发生什么 - 请记住,PHP 的 mail() 相当于在邮箱中放置一个信封 - 它实际上并没有传递邮件。
c) 您可能需要考虑切换到 PHPMailer 或 SwiftMailer,这两者都会为您提供更好的诊断消息,以防出现问题。
d) 您应该执行if ($_SERVER['REQUEST_METHOD'] == 'POST') { ... }
而不是检查表单字段。REQUEST_METHOD是 100% 可靠的,而检查模板字段取决于您不更改任何内容。