我正在构建我的联系表单电子邮件地址验证脚本。调试它并使用所有通过的有效电子邮件地址运行基本测试后,我继续测试无效地址。我的第一个测试是.ala.dom.com
明显无效的起始点和结束点。我希望得到我的错误信息。然而; 我的主机已将其设置为magic_quotes
打开,而电子邮件却通过了,因为地址的整个本地部分都用“这样的”进行了转义".ala."@dom.com
这是到达电子邮件收件箱的实际标题的摘录 -
Received: by srv28.000webhost.com (Postfix, from userid 7695918)
id 899601EE9C2; Sat, 5 Oct 2013 16:21:37 -0400 (EDT)
To: net@weedy101.netii.net
Subject: Should fold
X-PHP-Script: weedy101.netii.net/new-mail.php for 2.26.7.205
From: ".ala."@dom.com
Reply-To: ".ala."@dom.com
Content-type: text/html
Message-Id: <20131005202137.899601EE9C2@srv28.000webhost.com>
Date: Sat, 5 Oct 2013 16:21:37 -0400 (EDT)
我的主机000webhosts.com
有一个免费帐户,所以即使他们只使用php 5.2.*
我也无法访问php.ini
来更改设置,因此我需要以编程方式去除插入的字符,或者找到另一种解决方法。我完全不知道如何最好地处理这个问题。我的验证脚本是 -
<?php
if (isset($_POST['name']) && isset($_POST['message']) && isset($_POST['email']) && isset($_POST['subject'])) {
$name = $_POST['name'];
$text = $_POST['message'];
$contact = $_POST['email'];
$subject = $_POST['subject'];
$isValid = true;
$atIndex = strrpos($contact, "@");
$problem = 1;
if (is_bool($atIndex) && !$atIndex) {
$isValid = false;
$problem = 2;
}
else {
$domain = substr($contact, $atIndex+1);
$local = substr($contact, 0, $atIndex);
$localLen = strlen($local);
$domainLen = strlen($domain);
if ($localLen < 1 || $localLen > 64) {
$isValid = false;
$problem = 3;
}
else if ($domainLen < 1 || $domainLen > 255) {
$isValid = false;
$problem = 4;
}
else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) {
$isValid = false;
$problem = 5;
}
else if (preg_match('/\\.\\./', $domain)) {
$isValid = false;
$problem = 6;
}
else if (!(checkdnsrr($domain,"MX") || checkdnsrr($domain, "A"))) {
$isValid = false;
$problem = 7;
}
else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%£`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\","",$local))) {
if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\","",$local))) {
$isValid = false;
$problem = 8;
}
else if ($local[0] == '.' || $local[$localLen-1] == '.')
$isValid = false;
$problem = 9;
}
else if (preg_match('/\\.\\./', $local)) {
$isValid = false;
$problem = 10;
}
}
}
else {
$problem = 11;
}
if ($isValid == true) {
$message = "Message : <br/>" .$text . "<br/><br/>" . "From: " . $name . "<br/>" . $contact;
$headers = 'From: '. $contact . "\r\n" . 'Reply-To: ' . $contact . "\r\n" . "Content-type: text/html\r\n";
$mailto = 'net@weedy101.netii.net';
mail($mailto, $subject, $message, $headers );
}
header('location: index.php?pass='.$problem);
?>
随意调整它,因为我正在从http://www.linuxjournal.com/article/9585?page=0,0上的文章“使用 PHP 验证电子邮件地址,正确的方式”中调整它
<EDIT>
在完成了这里提供的所有帮助并完成了许多导致我仍然卡住的实验之后。虽然我可以通过逐字复制http://www.linuxjournal.com/article/9585?page=0,0上的原始参考文章示例来完成工作,这一切都很好,但我不能做的是调整它除了更改会破坏对象的预匹配字符串之外。因此,如果有人能找到一种方法来使其更具适应性,即作为外部函数或类可移植,以便可以随意重用。我将非常感谢您的帮助。
所以我将把它标记为已回答,但会继续阅读评论和任何新答案,希望有一天能够理解究竟是什么阻止了这个子程序被分离出来并更灵活地使用。