Make valid_email helper function more accurate
diff --git a/system/helpers/email_helper.php b/system/helpers/email_helper.php
index 0516e93..c7b3aba 100644
--- a/system/helpers/email_helper.php
+++ b/system/helpers/email_helper.php
@@ -42,12 +42,40 @@
 	/**
 	 * Validate email address
 	 *
+	 * Updated to be more accurate to RFC822
+	 * see: http://www.iamcal.com/publish/articles/php/parsing_email/
+	 *
 	 * @param	string
 	 * @return	bool
 	 */
-	function valid_email($address)
+	function valid_email($email)
 	{
-		return (bool) preg_match('/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix', $address);
+		$qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
+
+		$dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
+
+		$atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c'.
+			'\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
+
+		$quoted_pair = '\\x5c[\\x00-\\x7f]';
+
+		$domain_literal = "\\x5b({$dtext}|{$quoted_pair})*\\x5d";
+
+		$quoted_string = "\\x22({$qtext}|{$quoted_pair})*\\x22";
+
+		$domain_ref = $atom;
+
+		$sub_domain = "({$domain_ref}|{$domain_literal})";
+
+		$word = "({$atom}|{$quoted_string})";
+
+		$domain = "{$sub_domain}(\\x2e{$sub_domain})*";
+
+		$local_part = "{$word}(\\x2e{$word})*";
+
+		$addr_spec = "{$local_part}\\x40{$domain}";
+
+		return (bool) preg_match("!^{$addr_spec}$!", $email);
 	}
 }