我对PHP的了解太有限,无法完全理解我的可能性。
我一直在调整Bootstrap Temple的Ondrej Svestka的Mailscript。他在2年前发布了这个脚本,我一直在使用它取得了巨大的成功。但不是在AJAX模式下(因为Firefox更新总是会混淆功能),但实际上是“发送邮件 - >转发到下一页”。
在使用此脚本的早期阶段,我的服务器立即被垃圾邮件机器人敲打。所以我不得不引入一个.htaccess规则来阻止直接访问.php mailscript,这已经减少了很多不必要的垃圾邮件。但是,到目前为止,我收到的外语邮件越来越多,垃圾邮件的内容完全不相关。
所以我挖掘了该脚本的文档(Svestka的博客文章的评论部分)并发现了一个评论“添加一个隐藏的表单块,然后检查它是否仍然是空的 - 因为机器人会填补这个”。所以我实现了它,但它有CSS样式:隐藏 - 所以它没有触发。昨晚,我在添加“请将该字段留空”的信息时显示该块,并再次减少垃圾邮件。但是,它仍在发生。
我完全清楚你不能打击垃圾邮件机器人 - 但是我们也不要让它们过于简单。我可以实现一个Captcha系统,但是我在另一个页面上看到我正在管理,也很容易被破坏(因为机器人现在可以很容易地绕过这样的引擎)。不仅如此,我的代码还需要进行大规模的大修。老实说 - 我宁愿保持简单。
什么是实际代码?
我正在使用包含该表单的PHP文件,此文件访问jQuery validate.js,这是一个触发验证代码的.js文件(之前需要AJAX,但我删除了它 - 因为它导致了问题)和最后是PHP格式的邮件脚本本身
这是表单本身
<form id="contact-form" method="post" action="../assets/mailscript.php" role="form">
<div class="controls">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="form_name">Firstname <span class="warning-star">*</span></label>
<input id="form_name" type="text" name="name" class="form-control" placeholder="Please enter your firstname" required="required" data-error="Firstname is required.">
<div class="help-block with-errors"></div>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="form_lastname">Lastname <span class="warning-star">*</span></label>
<input id="form_lastname" type="text" name="surname" class="form-control" placeholder="Please enter your lastname" required="required" data-error="Lastname is required.">
<div class="help-block with-errors"></div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="form_email">Email <span class="warning-star">*</span></label>
<input id="form_email" type="email" name="email" class="form-control" placeholder="Please enter your email" required="required" data-error="Valid email is required.">
<div class="help-block with-errors"></div>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="form_url">URL (Demo Track, homepage, social media, etc)</label>
<input id="form_url" type="text" name="url" class="form-control" placeholder="Please provide an URL - http://">
<div class="help-block with-errors"></div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="form-group">
<label for="check">If you're a human being, please leave the next field blank</label>
<input id="check" type="text" name="check" class="form-control" style="width:50px;"> <!-- no bots! -->
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="form-group">
<label for="form_purpose">What is the contact reason</label>
<select id="form_purpose" name="purpose" class="form-control">
<option value="General Questions">I have general questions</option>
<option value="Client Inquiry">I'd like to book your services</option>
<option value="Opt Out">Please update my personal info (opt out)</option>
</select>
<div class="help-block with-errors"></div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="form-group">
<label for="form_message">Message <span class="warning-star">*</span></label>
<textarea id="form_message" name="message" class="form-control" placeholder="Please enter your message" rows="5" required="required" data-error="Please leave us a message."></textarea>
<div class="help-block with-errors"></div>
</div>
</div>
<div class="col-sm-6">
<input type="submit" class="btn btn-success btn-send" value="Send message">
</div>
<div class="col-sm-6">
<p class="text-muted text-right"><span class="warning-star">*</span> required</p>
</div>
</div>
</div> <!-- .controls -->
<div class="messages"></div>
</form>
这是mailscript PHP
<?php
// configure
$from = 'mail@server.com';
$sendTo = 'mail@server.com';
$subject = 'Homepage Name - new message from contact form';
$fields = array('name' => 'Name', 'surname' => 'Surname', 'email' => 'Email', 'url' => 'URL', 'purpose' => 'Purpose', 'message' => 'Message', 'check' => 'checking for spam'); // array variable name => Text to appear in email
$okMessage = 'Thank you, submission successful. We will get back to you ASAP';
$errorMessage = 'There was an error while submitting the form. Please try again later';
// let's do the sending
try
{
$emailText = "You have one new message from your contact form\n=============================\n";
foreach ($_POST as $key => $value) {
if (isset($fields[$key])) {
$emailText .= "$fields[$key]: $value\n";
}
}
$headers = array
( 'Content-Type: text/plain; charset="UTF-8";',
'From: ' . $from,
'Reply-To: ' . $from,
'Return-Path: ' . $from,
);
if (empty($_POST['check'])) { // checks if the hidden "check" form is empty or not)
mail($sendTo, $subject, $emailText, implode("\n", $headers)); // the code to send the mail
}
$responseArray = array('type' => 'success', 'message' => $okMessage);
}
catch (\Exception $e)
{
$responseArray = array('type' => 'danger', 'message' => $errorMessage);
}
if ($responseArray['type'] == 'success') {
// success redirect
header('Location: ../pages/contact-success.php');
}
else {
//error redirect
header('Location: ../pages/contact-fail.php');
}
?>
该脚本正常运行。输入您的必填信息,点击发送,转发到错误消息或确认页面。不久之后,我收到了一封邮件。
如果“垃圾邮件检查”字段留空,也可以使用。如果有人输入任何内容,你仍然会收到确认页面,但我没有收到邮件(虽然可以更好地处理,但是我们不会训练机器人AI)。
现在的问题是,我仍然(!)收到垃圾邮件,即使该字段留空。所以我就像“一个简单的问题可以工作”。事实上,显然有一个代码片段可以改变。但我不确定这是否正确,或者可以更好地处理。
而不是以下内容:
if (empty($_POST['check'])) { // checks if the hidden "check" form is empty or not)
mail($sendTo, $subject, $emailText, implode("\n", $headers)); // the code to send the mail
}
我可以要求这个脚本的用户插入一个简单的单词或做一个快速的数学方程式。然后代码(根据原始代码编写器)看起来像这样:
if ($_POST['check'] !== 22) throw new \Exception();
mail($sendTo, $subject, $emailText, implode("\n", $headers)); // the code to send the mail
因此,如果要插入值22(来自数学或其他),那么mail($sendTo...
会被触发吗?那是对的吗?我不能将条件中的比较运算符(if / then / else)改为==吗?还是我过于复杂了?
如果我想读出一个字符串,一个用户用小写字母写,另一个用大写字母和小写字母写,又用另一个用大写字母写成,该怎么办?我是否需要去&amp;&amp;路线?
脚本最终会做什么?
简而言之 - 人们应填写表格并快速进行“人工检查”(数学问题或“请在此处插入以下单词”),然后点击发送。保持尽可能简单和兼容尽可能多的设备。
问题虽然......是“抛出新的\ Exception();”一个好的/可行的解决方案,或者邮件是否会被发送?