diff --git a/include/class.organization.php b/include/class.organization.php
index 4f55f290b3d08d038c07c2d97552095d80932633..3342289557c1077eeabebe7dc86e21c9f9a4d679 100644
--- a/include/class.organization.php
+++ b/include/class.organization.php
@@ -166,6 +166,15 @@ class Organization extends OrganizationModel {
         return false;
     }
 
+    static function forDomain($domain) {
+        foreach (static::objects()
+                ->filter(array('domain__contains'=>$domain)) as $org) {
+            if ($org->isMappedToDomain($domain)) {
+                return $org;
+            }
+        }
+    }
+
     function to_json() {
 
         $info = array(
diff --git a/include/class.ticket.php b/include/class.ticket.php
index 0bf1e57d7c80e088db109e2e989914d464dd55eb..57cfe653c4b14300cac586c1836881a6758a5ddc 100644
--- a/include/class.ticket.php
+++ b/include/class.ticket.php
@@ -2300,19 +2300,28 @@ class Ticket {
 
             // Allow vars to be changed in ticket filter and applied to the user
             // account created or detected
+            if (!$user && $vars['email'])
+                $user = User::lookupByEmail($vars['email']);
+
             if (!$user) {
+                // Reject emails if not from registered clients (if
+                // configured)
+                if ($source == 'email' && !$cfg->acceptUnregisteredEmail()) {
+                    list($mailbox, $domain) = explode('@', $vars['email'], 2);
+                    // Users not yet created but linked to an organization
+                    // are still acceptable
+                    if (!Organization::forDomain($domain)) {
+                        return $reject_ticket(
+                            sprintf('Ticket rejected (%s) (unregistered client)',
+                                $vars['email']));
+                    }
+                }
+
                 $user_form = UserForm::getUserForm()->getForm($vars);
                 if (!$user_form->isValid($field_filter('user'))
                         || !($user=User::fromVars($user_form->getClean())))
                     $errors['user'] = 'Incomplete client information';
             }
-
-            // Reject emails if not from registered clients (if configured)
-            if (!$cfg->acceptUnregisteredEmail() && !$user->getAccount()) {
-                return $reject_ticket(
-                    sprintf('Ticket rejected (%s) (unregistered client)',
-                        $vars['email']));
-            }
         }
 
         // Any error above is fatal.
diff --git a/include/class.user.php b/include/class.user.php
index 8adb24ea07d5294cdcd2ad4d99331dd937c9789b..ac544e8f4c79bd384bc1570c8ddc177893accce9 100644
--- a/include/class.user.php
+++ b/include/class.user.php
@@ -144,7 +144,7 @@ class User extends UserModel {
 
     static function fromVars($vars) {
         // Try and lookup by email address
-        $user = User::lookup(array('emails__address'=>$vars['email']));
+        $user = static::lookupByEmail($vars['email']);
         if (!$user) {
             $user = User::create(array(
                 'name'=>$vars['name'],
@@ -156,13 +156,8 @@ class User extends UserModel {
             ));
             // Is there an organization registered for this domain
             list($mailbox, $domain) = explode('@', $vars['email'], 2);
-            foreach (Organization::objects()
-                    ->filter(array('domain__contains'=>$domain)) as $org) {
-                if ($org->isMappedToDomain($domain)) {
-                    $user->setOrganization($org);
-                    break;
-                }
-            }
+            if ($org = Organization::forDomain($domain))
+                $user->setOrganization($org);
 
             $user->save(true);
             $user->emails->add($user->default_email);
@@ -396,6 +391,10 @@ class User extends UserModel {
         // Delete user
         return parent::delete();
     }
+
+    static function lookupByEmail($email) {
+        return self::lookup(array('emails__address'=>$email));
+    }
 }
 
 class PersonsName {