diff --git a/include/class.validator.php b/include/class.validator.php
index 62ce6815345bb754a9d260211b1585f42e7c836d..74e13f983a44994f6a86594735b9dd2d2c115a74 100644
--- a/include/class.validator.php
+++ b/include/class.validator.php
@@ -137,7 +137,8 @@ class Validator {
     /*** Functions below can be called directly without class instance.
          Validator::func(var..);  (nolint) ***/
     function is_email($email) {
-        return preg_match('/^([*+!.&#$|\'\\%\/0-9a-z^_`{}=?~:-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i',$email);
+        require_once PEAR_DIR.'Mail/RFC822.php';
+        return !PEAR::isError(Mail_RFC822::parseAddressList($email));
     }
     function is_phone($phone) {
         /* We're not really validating the phone number but just making sure it doesn't contain illegal chars and of acceptable len */
diff --git a/setup/test/tests/test.validation.php b/setup/test/tests/test.validation.php
index 942767329642101c1f6db4a483ff23798936c118..20b1eae9aa85cf36a9355de41c468feb74e5e6a1 100644
--- a/setup/test/tests/test.validation.php
+++ b/setup/test/tests/test.validation.php
@@ -15,6 +15,39 @@ class TestValidation extends Test {
         $this->assert(Validator::is_username('中国期刊全文数据'));
         // Non-letters
         $this->assert(!Validator::is_username('j®red'));
+        // Special chars
+        $this->assert(Validator::is_username('jar.ed'));
+        $this->assert(Validator::is_username('jar_ed'));
+        $this->assert(Validator::is_username('jar-ed'));
+        // Illegals
+        $this->assert(!Validator::is_username('j red'));
+        $this->assert(!Validator::is_username('jared '));
+        $this->assert(!Validator::is_username(' jared'));
+    }
+
+    function testValidEmail() {
+        // Common emails
+        $this->assert(Validator::is_email('jared@domain.tld'));
+        $this->assert(Validator::is_email('jared12@domain.tld'));
+        $this->assert(Validator::is_email('jared.12@domain.tld'));
+        $this->assert(Validator::is_email('jared_12@domain.tld'));
+        $this->assert(Validator::is_email('jared-12@domain.tld'));
+
+        // Very likely illegal
+        $this->assert(!Validator::is_email('jared r@domain.tld'));
+        $this->assert(Validator::is_email('jared@host'));
+
+        // Odd cases, but legal
+        $this->assert(Validator::is_email('jared@[127.0.0.1]'));
+        $this->assert(Validator::is_email('jared@[ipv6:::1]'));
+        $this->assert(Validator::is_email('*@domain.tld'));
+        $this->assert(Validator::is_email("'@domain.tld"));
+        $this->assert(Validator::is_email('"jared r"@domain.tld'));
+
+        // RFC 6530
+        #$this->assert(Validator::is_email('Pelé@example.com'));
+        #$this->assert(Validator::is_email('δοκιμή@παράδειγμα.δοκιμή'));
+        #$this->assert(Validator::is_email('甲斐@黒川.日本'));
     }
 }
 return 'TestValidation';