Index: wp-includes/formatting.php
===================================================================
--- wp-includes/formatting.php	(revision 5811)
+++ wp-includes/formatting.php	(working copy)
@@ -664,16 +664,53 @@
 
 
 function is_email($user_email) {
-	$chars = "/^([a-z0-9+_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,6}\$/i";
-	if (strpos($user_email, '@') !== false && strpos($user_email, '.') !== false) {
-		if (preg_match($chars, $user_email)) {
-			return true;
-		} else {
-			return false;
-		}
-	} else {
-		return false;
+	// regex from http://iamcal.com/publish/articles/php/parsing_email/
+	$no_ws_ctl	= "[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]";
+	$alpha		= "[\\x41-\\x5a\\x61-\\x7a]";
+	$digit		= "[\\x30-\\x39]";
+	$cr		= "\\x0d";
+	$lf		= "\\x0a";
+	$crlf		= "($cr$lf)";
+	$obs_char	= "[\\x00-\\x09\\x0b\\x0c\\x0e-\\x7f]";
+	$obs_text	= "($lf*$cr*($obs_char$lf*$cr*)*)";
+	$text		= "([\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f]|$obs_text)";
+	$obs_qp		= "(\\x5c[\\x00-\\x7f])";
+	$quoted_pair	= "(\\x5c$text|$obs_qp)";
+	$wsp		= "[\\x20\\x09]";
+	$obs_fws	= "($wsp+($crlf$wsp+)*)";
+	$fws		= "((($wsp*$crlf)?$wsp+)|$obs_fws)";
+	$ctext		= "($no_ws_ctl|[\\x21-\\x27\\x2A-\\x5b\\x5d-\\x7e])";
+	$ccontent	= "($ctext|$quoted_pair)";
+	$comment	= "(\\x28($fws?$ccontent)*$fws?\\x29)";
+	$cfws		= "(($fws?$comment)*($fws?$comment|$fws))";
+	$cfws		= "$fws*";
+	$atext		= "($alpha|$digit|[\\x21\\x23-\\x27\\x2a\\x2b\\x2d\\x2e\\x3d\\x3f\\x5e\\x5f\\x60\\x7b-\\x7e])";
+	$atom		= "($cfws?$atext+$cfws?)";
+	$qtext		= "($no_ws_ctl|[\\x21\\x23-\\x5b\\x5d-\\x7e])";
+	$qcontent	= "($qtext|$quoted_pair)";
+	$quoted_string	= "($cfws?\\x22($fws?$qcontent)*$fws?\\x22$cfws?)";
+	$word		= "($atom|$quoted_string)";
+	$obs_local_part	= "($word(\\x2e$word)*)";
+	$obs_domain	= "($atom(\\x2e$atom)*)";
+	$dot_atom_text	= "($atext+(\\x2e$atext+)*)";
+	$dot_atom	= "($cfws?$dot_atom_text$cfws?)";
+	$dtext		= "($no_ws_ctl|[\\x21-\\x5a\\x5e-\\x7e])";
+	$dcontent	= "($dtext|$quoted_pair)";
+	$domain_literal	= "($cfws?\\x5b($fws?$dcontent)*$fws?\\x5d$cfws?)";
+	$local_part	= "($dot_atom|$quoted_string|$obs_local_part)";
+	$domain		= "($dot_atom|$domain_literal|$obs_domain)";
+	$addr_spec	= "($local_part\\x40$domain)";
+
+	// we need to strip comments first (repeat until we can't find any more)
+	$done = 0;
+	while(! $done ) {
+		$new = preg_replace( "!$comment!", '', $user_email );
+		if (strlen($new) == strlen($user_email))
+			$done = 1;
+		$user_email = $new;
 	}
+
+	return preg_match("!^$addr_spec$!", $user_email) ? true : false;
 }
 
 // used by wp-mail to handle charsets in email subjects
