过滤PHP联系表单上的垃圾邮件

时间:2016-08-09 20:24:13

标签: php email spam-prevention

人。我一直在努力解决这个问题,但我对PHP很新。我已经为PHP垃圾邮件过滤器尝试了各种各样的教程,但是当我将它们写入表单时,它们都没有正常工作。

我一直试图修改的代码是:

<?php
header ("Location: index.html");
if( !empty($_POST['topName']) || !empty($_POST['topEmail']) || !empty($_POST['topPhone']) ) {
    $name = $_POST['topName'];
    $emailAddress = $_POST['topEmail'];
    $phone = $_POST['topPhone'];
    $message = $_POST['topMessage'];

    $email_to = "companyname@gmail.com";
    $email_from = "$name <$emailAddress>";
    $email_subject = "Message from online contact form";
    $email_body = "From: $name\n" .
                   "Email: $emailAddress\n" .
                   "Phone: $phone\n\n" .
                   "$message";
    $email_headers = "From: $email_from \r\n" .
                "Reply-To: $emailAddress \r\n";

    mail($email_to, $email_subject, $email_body, $email_headers);
}
exit;
?>

其中唯一有效的部分是添加!empty内容,但这仍然只能阻止垃圾邮件将这些字段留空。当我按照教程时,我似乎无法工作。我可以做些什么来制作一个超级简单的垃圾邮件过滤器,或者一个新手可以理解的教程吗?

任何帮助或建议都将不胜感激!

2 个答案:

答案 0 :(得分:0)

要确保字段不为空,您可以执行以下某些验证:

<?php

function checkLength($d, $min, $max){
    if(strlen($d) > $max || strlen($d) < $min){
        return false;
    } else {
        return true;
    }
}

function checkRegEx($d, $reg){
    return ereg($reg, $d);
}

$fields = [
    'name' => $_POST['topName'],
    'email' => $_POST['topEmail'],
    'phone' => $_POST['topPhone']
]

$valid = true;

// Check that each is not empty
foreach($fields as $k => $v){
    $valid = $valid && !empty($v);
}

// Add HTML Safe Message
$fields['message'] = htmlentities($_POST['topMessage']);

// Check that name has enough characters
$valid = $valid && checkLength($fields['name'], 3, 25);

// Check that Email has enough characters
$valid = $valid && checkLength($fields['email'], 5, 80);

// Check Email format
$valid = $valid && checkRegEx($fields['email'], "/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/");

if( $valid ) {
    $email_to = "companyname@gmail.com";
    $email_from = "{$fields['name']} <{$fields['email']}>";
    $email_subject = "Message from online contact form";
    $email_body = "";
    $email_body .= "From: {$fields['name']}\r\n";
    $email_body .= "Email: {$fields['email']}\r\n";
    $email_body .= "Phone: {$fields['phone']}\r\n\r\n";
    $email_body .= $fields['message'];
    $email_headers = "From: {$fields['email']}\r\n";
    $email_headers .= "Reply-To: {$fields['email']}\r\n";

    mail($email_to, $email_subject, $email_body, $email_headers);
}
exit;
?>

答案 1 :(得分:0)

阻止垃圾邮件的最有效方法之一是确保每个字段都包含预期的内容。例如,名称应仅包括字母,电话号码等。如果不需要包含URLS的文本字段,则不提交邮件将消除大量垃圾邮件。

接下来,您可以使用蜜罐字段。这些是隐藏在人群中但通常由垃圾邮件机器人检测到的字段。如果提交内容包含任何内容,您可以检查提交内容,如果他们知道它是垃圾邮件。

您还可以检查表单页面显示和提交表单之间的时间。非常快速的提交表明已经发现了垃圾邮件。

Captcha应该是最后的手段,也许只有在其他技术提示垃圾邮件时才会显示。

最后,你可以通过使用一个为你做很多事情的课程,让自己的生活变得更轻松,例如: http://stefangabos.ro/php-libraries/zebra-form/或像http://wufoo.com

这样的表单构建应用