diff --git a/src/UnicaenZimbra/Processus/BoiteGenerique.php b/src/UnicaenZimbra/Processus/BoiteGenerique.php index 023945fb59e48ff8601bc76e73f31a54a9462622..6c15953dc85e845953182d80184cf366339cd04e 100644 --- a/src/UnicaenZimbra/Processus/BoiteGenerique.php +++ b/src/UnicaenZimbra/Processus/BoiteGenerique.php @@ -31,32 +31,32 @@ class BoiteGenerique extends Processus * @param string $description Description * @return self */ - public function create( $mail, $password, $name, $description ) + public function create($mail, $password, $name, $description) { $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); $cosService = $this->getServiceManager()->get('zimbraServiceCos'); $account = new Account; - $account->name = $mail; + $account->name = $mail; $account->description = $description; $account->zimbraCOSId = $this->getServiceManager()->get('zimbraOptions')->getBoiteGeneriqueCosId(); - $accountService->create( $account, $password ); - $accountService->addAlias($account, $name.substr($mail, strpos($mail,'@'))); + $accountService->create($account, $password); + $accountService->addAlias($account, $name . substr($mail, strpos($mail, '@'))); return $this; } - + /** * Renommer une boîte générique - * + * * @param string $mail adresse mail de la boîte générique * @param string $newName nouveau nom * @return self */ - public function rename( $mail, $newName) + public function rename($mail, $newName) { - $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); - $accountService->rename($accountService->get($mail), $newName); - return $this; + $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); + $accountService->rename($accountService->get($mail), $newName); + return $this; } /** @@ -65,7 +65,7 @@ class BoiteGenerique extends Processus * @param string $mail Adresse mail de la boite générique * @return self */ - public function delete( $mail ) + public function delete($mail) { $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); $accountService->delete($accountService->get($mail)); @@ -79,15 +79,15 @@ class BoiteGenerique extends Processus * @param string $adresseFonctionnelle Adresse mail de l'adresse fonctionnelle * @return self */ - public function createAdresseFonctionnelle( $mail, $adresseFonctionnelle ) + public function createAdresseFonctionnelle($mail, $adresseFonctionnelle) { - $afName = $this->getMailName( $adresseFonctionnelle ); + $afName = $this->getMailName($adresseFonctionnelle); - // Récupération des services - $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); - $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); - $folderService = $this->getServiceManager()->get('zimbraServiceFolder'); - $filterService = $this->getServiceManager()->get('zimbraServiceFilter'); + // Récupération des services + $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); + $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); + $folderService = $this->getServiceManager()->get('zimbraServiceFolder'); + $filterService = $this->getServiceManager()->get('zimbraServiceFilter'); // Travail sur la boite générique $bg = $accountService->get($mail); @@ -95,37 +95,41 @@ class BoiteGenerique extends Processus $filterService->setAccount($bg); // Liste de distribution - $distribList = $distribListService->create($adresseFonctionnelle); - $distribListService->addMembers($distribList, $mail); - + $distribList = $distribListService->create($adresseFonctionnelle); + $distribListService->addMembers($distribList, $mail); + // Répertoires - $inputFolder = $folderService->create($afName.' | Réception'); - $sentFolder = $folderService->create($afName.' | Envoi'); + $inputFolder = $folderService->create($afName . ' | Réception'); + $sentFolder = $folderService->create($afName . ' | Envoi'); // Filtre de réception $filter = new Filter; - $filter->setName($afName.' | Réception') - ->setCondition($filter::CONDITION_ANYOF); + $filter->setName($afName . ' | Réception') + ->setCondition($filter::CONDITION_ANYOF); $test1 = new FilterTestAddress; $test1->setHeader('to,cc')->setStringComparison('contains')->setPart('all') - ->setValue($adresseFonctionnelle); - $test2 = new FilterTestHeader; - $test2->setHeader('X-Zimbra-DL')->setStringComparison('contains') - ->setValue($adresseFonctionnelle); - $filter->setTests(array($test1, $test2)); + ->setValue($adresseFonctionnelle); + $test2 = new FilterTestHeader; + $test2->setHeader('X-Zimbra-DL')->setStringComparison('contains') + ->setValue($adresseFonctionnelle); + $filter->setTests([$test1, $test2]); + $test3 = new FilterTestHeader; + $test3->setHeader('Resent-To')->setStringComparison('contains') + ->setValue($adresseFonctionnelle); + $filter->setTests([$test1, $test2, $test3]); $action = new FilterActionFileInto; - $action->setFolderPath( $inputFolder->absFolderPath ); + $action->setFolderPath($inputFolder->absFolderPath); $filter->addAction($action); - $filter->addAction( new FilterActionKeep ); + $filter->addAction(new FilterActionKeep); $filterService->createInput($filter); - + return $this; } - + /** * Renommer une adresse fonctionnelle - * + * * @param string $mail Adresse mail de la boite générique * @param string $adresseFonctionnelle adresse mail de l'adresse fonctionnelle * @param string $newName nouveau nom @@ -133,52 +137,55 @@ class BoiteGenerique extends Processus */ public function renameAdresseFonctionnelle($mail, $adresseFonctionnelle, $newName) { - $afName = $this->getMailName($adresseFonctionnelle); - $afNewName = $this->getMailName($newName); - - // récupération des services + $afName = $this->getMailName($adresseFonctionnelle); + $afNewName = $this->getMailName($newName); + + // récupération des services $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); - $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); + $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); $folderService = $this->getServiceManager()->get('zimbraServiceFolder'); $filterService = $this->getServiceManager()->get('zimbraServiceFilter'); - - // Travail sur la boite générique + + // Travail sur la boite générique $bg = $accountService->get($mail); $folderService->setAccount($bg); $filterService->setAccount($bg); - - // Liste de distribution - // la suppression de la liste de distribution permet de supprimer les droits (ACE) sur celle-ci - $distribListService->delete($distribListService->get($adresseFonctionnelle)); - $distribList = $distribListService->create($newName); - $distribListService->addMembers($distribList, $mail); - - // Répertoires - $inputFolder = $folderService->rename($folderService->get($afName.' | Réception'), $afNewName.' | Réception'); - $sentFolder = $folderService->rename($folderService->get($afName.' | Envoi'), $afNewName.' | Envoi'); - - // Filtre entrant - $filter = new Filter; -// $filter = $filterService->getInput()[$afName.' | Réception']; - $filter->setName($afNewName.' | Réception') - ->setCondition($filter::CONDITION_ANYOF); - $test1 = new FilterTestAddress(); + + // Liste de distribution + // la suppression de la liste de distribution permet de supprimer les droits (ACE) sur celle-ci + $distribListService->delete($distribListService->get($adresseFonctionnelle)); + $distribList = $distribListService->create($newName); + $distribListService->addMembers($distribList, $mail); + + // Répertoires + $inputFolder = $folderService->rename($folderService->get($afName . ' | Réception'), $afNewName . ' | Réception'); + $sentFolder = $folderService->rename($folderService->get($afName . ' | Envoi'), $afNewName . ' | Envoi'); + + // Filtre entrant + $filter = new Filter; +// $filter = $filterService->getInput()[$afName.' | Réception']; + $filter->setName($afNewName . ' | Réception') + ->setCondition($filter::CONDITION_ANYOF); + $test1 = new FilterTestAddress(); $test1->setHeader('to,cc')->setStringComparison('contains')->setPart('all') - ->setValue($newName); - $test2 = new FilterTestHeader(); - $test2->setHeader('X-Zimbra-DL')->setStringComparison('contains') - ->setValue($newName); - $filter->setTests(array($test1, $test2)); - - $action = new FilterActionFileInto; - $action->setFolderPath( $afNewName.' | Réception' ); + ->setValue($newName); + $test2 = new FilterTestHeader(); + $test2->setHeader('X-Zimbra-DL')->setStringComparison('contains') + ->setValue($newName); + $test3 = new FilterTestHeader; + $test3->setHeader('Resent-To')->setStringComparison('contains') + ->setValue($newName); + $filter->setTests([$test1, $test2, $test3]); + + $action = new FilterActionFileInto; + $action->setFolderPath($afNewName . ' | Réception'); $filter->addAction($action); - $filter->addAction( new FilterActionKeep ); - - $filterService->deleteInput($afName.' | Réception'); - $filterService->createInput($filter); - - return $this; + $filter->addAction(new FilterActionKeep); + + $filterService->deleteInput($afName . ' | Réception'); + $filterService->createInput($filter); + + return $this; } /** @@ -188,49 +195,49 @@ class BoiteGenerique extends Processus * @param string $adresseFonctionnelle Adresse mail de l'adresse fonctionnelle * @return self */ - public function deleteAdresseFonctionnelle( $mail, $adresseFonctionnelle ) + public function deleteAdresseFonctionnelle($mail, $adresseFonctionnelle) { - $afName = $this->getMailName( $adresseFonctionnelle ); + $afName = $this->getMailName($adresseFonctionnelle); - // récupération des services + // récupération des services $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); - $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); + $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); $folderService = $this->getServiceManager()->get('zimbraServiceFolder'); $filterService = $this->getServiceManager()->get('zimbraServiceFilter'); - + // Travail sur la boite générique $bg = $accountService->get($mail); $folderService->setAccount($bg); $filterService->setAccount($bg); - // Liste de distribution - $distribListService->delete($distribListService->get($adresseFonctionnelle)); + // Liste de distribution + $distribListService->delete($distribListService->get($adresseFonctionnelle)); // Répertoires - $folderService->delete($folderService->get($afName.' | Réception')); - $folderService->delete($folderService->get($afName.' | Envoi')); + $folderService->delete($folderService->get($afName . ' | Réception')); + $folderService->delete($folderService->get($afName . ' | Envoi')); // Filtres - $filterService->deleteInput($afName.' | Réception'); - + $filterService->deleteInput($afName . ' | Réception'); + return $this; } - + /** * Retourner les droits sur une adresse fonctionnelle * Permet notamment de récupérer les utilisateurs qui ont un accès à l'adresse fonctionnelle - * + * * @param type $adresseFonctionnelle Adresse mail de l'adresse fonctionnelle * @return Right[] */ - public function getGrantsOfAdresseFonctionnelle( $adresseFonctionnelle ) + public function getGrantsOfAdresseFonctionnelle($adresseFonctionnelle) { - $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); - $rightService = $this->getServiceManager()->get('zimbraServiceRight'); - - $ace = new Right; - $ace->setTarget($distribListService->get($adresseFonctionnelle)); - return $rightService->getGrants($ace); + $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); + $rightService = $this->getServiceManager()->get('zimbraServiceRight'); + + $ace = new Right; + $ace->setTarget($distribListService->get($adresseFonctionnelle)); + return $rightService->getGrants($ace); } /** @@ -244,31 +251,31 @@ class BoiteGenerique extends Processus { $afName = $this->getMailName($adresseFonctionnelle); - $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); - $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); - $folderService = $this->getServiceManager()->get('zimbraServiceFolder'); - $filterService = $this->getServiceManager()->get('zimbraServiceFilter'); - $rightService = $this->getServiceManager()->get('zimbraServiceRight'); - $identityService = $this->getServiceManager()->get('zimbraServiceIdentity'); + $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); + $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); + $folderService = $this->getServiceManager()->get('zimbraServiceFolder'); + $filterService = $this->getServiceManager()->get('zimbraServiceFilter'); + $rightService = $this->getServiceManager()->get('zimbraServiceRight'); + $identityService = $this->getServiceManager()->get('zimbraServiceIdentity'); // Travail sur la boite générique - $dlAccount = $distribListService->get($adresseFonctionnelle); - $bgAccount = $dlAccount->members[0]; - $userAccount = $accountService->get( $userMail ); + $dlAccount = $distribListService->get($adresseFonctionnelle); + $bgAccount = $dlAccount->members[0]; + $userAccount = $accountService->get($userMail); $folderService->setAccount($bgAccount); // Partages - $inputFolder = $folderService->get($afName.' | Réception'); - $sentFolder = $folderService->get($afName.' | Envoi'); - - $grant = new Grant; + $inputFolder = $folderService->get($afName . ' | Réception'); + $sentFolder = $folderService->get($afName . ' | Envoi'); + + $grant = new Grant; $grant->setGrantee($userAccount); $grant->perm = Grant::PERM_MANAGE; - $folderService->addGrant( $inputFolder, $grant, FolderService::GRANT_ACTION_NONE ) - ->createMountPoint($inputFolder, $userAccount, $inputFolder->absFolderPath) - ->addGrant( $sentFolder, $grant, FolderService::GRANT_ACTION_NONE ) - ->createMountPoint($sentFolder, $userAccount, $sentFolder->absFolderPath); + $folderService->addGrant($inputFolder, $grant, FolderService::GRANT_ACTION_NONE) + ->createMountPoint($inputFolder, $userAccount, $inputFolder->absFolderPath) + ->addGrant($sentFolder, $grant, FolderService::GRANT_ACTION_NONE) + ->createMountPoint($sentFolder, $userAccount, $sentFolder->absFolderPath); // Travail sur la boite utilisateur $filterService->setAccount($userAccount); @@ -277,27 +284,27 @@ class BoiteGenerique extends Processus // Filtre d'envoi $filter = new Filter; - $filter->setName($afName.' | Envoi') - ->setCondition($filter::CONDITION_ANYOF); + $filter->setName($afName . ' | Envoi') + ->setCondition($filter::CONDITION_ANYOF); $test1 = new FilterTestAddress; - $test1->setHeader('from')->setStringComparison('contains')->setPart('all') - ->setValue($adresseFonctionnelle); - $test2 = new FilterTestHeader(); - $test2->setHeader('Reply-To')->setStringComparison('contains') - ->setValue($adresseFonctionnelle); - $filter->setTests(array($test1, $test2)); + $test1->setHeader('from')->setStringComparison('contains')->setPart('all') + ->setValue($adresseFonctionnelle); + $test2 = new FilterTestHeader(); + $test2->setHeader('Reply-To')->setStringComparison('contains') + ->setValue($adresseFonctionnelle); + $filter->setTests([$test1, $test2]); $action = new FilterActionFileInto; - $action->setFolderPath( $sentFolder->absFolderPath ); + $action->setFolderPath($sentFolder->absFolderPath); $filter->addAction($action); $filterService->createOutput($filter); - - // ACE - $ace = new Right; - $ace->setTarget($dlAccount) - ->setGrantee($userAccount) - ->setRightByRightName('sendAsDistList'); - $rightService->grantRight($ace); + + // ACE + $ace = new Right; + $ace->setTarget($dlAccount) + ->setGrantee($userAccount) + ->setRightByRightName('sendAsDistList'); + $rightService->grantRight($ace); // Avatar $identity = new Identity; @@ -305,14 +312,14 @@ class BoiteGenerique extends Processus $identity->zimbraPrefFromAddress = $adresseFonctionnelle; $identity->zimbraPrefFromAddressType = 'sendAs'; $identity->zimbraPrefFromDisplay = $afName; - $identity->zimbraPrefWhenInFolderIds = $folderService->get($afName.' | Réception')->getId(); + $identity->zimbraPrefWhenInFolderIds = $folderService->get($afName . ' | Réception')->getId(); $identity->zimbraPrefWhenInFoldersEnabled = true; $identity->zimbraPrefReplyToAddress = $adresseFonctionnelle; $identity->zimbraPrefReplyToEnabled = true; $identity->zimbraPrefWhenSentToAddresses = $adresseFonctionnelle; $identity->zimbraPrefWhenSentToEnabled = true; $identityService->create($identity); - + return $this; } @@ -327,48 +334,48 @@ class BoiteGenerique extends Processus { $afName = $this->getMailName($adresseFonctionnelle); - $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); - $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); - $folderService = $this->getServiceManager()->get('zimbraServiceFolder'); - $filterService = $this->getServiceManager()->get('zimbraServiceFilter'); - $rightService = $this->getServiceManager()->get('zimbraServiceRight'); - $identityService = $this->getServiceManager()->get('zimbraServiceIdentity'); - - // Travail sur la boite générique - $dlAccount = $distribListService->get($adresseFonctionnelle); - $bgAccount = $dlAccount->members[0]; - $userAccount = $accountService->get( $userMail ); + $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); + $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); + $folderService = $this->getServiceManager()->get('zimbraServiceFolder'); + $filterService = $this->getServiceManager()->get('zimbraServiceFilter'); + $rightService = $this->getServiceManager()->get('zimbraServiceRight'); + $identityService = $this->getServiceManager()->get('zimbraServiceIdentity'); + + // Travail sur la boite générique + $dlAccount = $distribListService->get($adresseFonctionnelle); + $bgAccount = $dlAccount->members[0]; + $userAccount = $accountService->get($userMail); $folderService->setAccount($bgAccount); // Suppression des partages - $inputFolder = $folderService->get($afName.' | Réception'); - $sentFolder = $folderService->get($afName.' | Envoi'); + $inputFolder = $folderService->get($afName . ' | Réception'); + $sentFolder = $folderService->get($afName . ' | Envoi'); - $folderService->revokeGrant( $inputFolder, $userAccount ) - ->revokeGrant( $sentFolder, $userAccount ); + $folderService->revokeGrant($inputFolder, $userAccount) + ->revokeGrant($sentFolder, $userAccount); // Travail sur la boite utilisateur $filterService->setAccount($userAccount); $identityService->setAccount($userAccount); // Filtres - $filterService->deleteOutput($afName.' | Envoi'); - - // ACE - $ace = new Right; - $ace->setTarget($dlAccount) - ->setGrantee($userAccount) - ->setRightByRightName('sendAsDistList'); - $rightService->revokeRight($ace); + $filterService->deleteOutput($afName . ' | Envoi'); + + // ACE + $ace = new Right; + $ace->setTarget($dlAccount) + ->setGrantee($userAccount) + ->setRightByRightName('sendAsDistList'); + $rightService->revokeRight($ace); // Avatar - $identityService->delete( $identityService->get($afName) ); + $identityService->delete($identityService->get($afName)); return $this; } - + /** * Renommer une adresse fonctionnelle pour un utilisateur - * + * * @param string $adresseFonctionnelle adresse mail de l'adresse fonctionnelle * @param type $userMail adresse mail de l'utilisateur * @param type $newName nouveau nom @@ -376,65 +383,65 @@ class BoiteGenerique extends Processus */ public function renameAdresseFonctionnelleToUser($adresseFonctionnelle, $userMail, $newName) { - $afName = $this->getMailName($adresseFonctionnelle); - $afNewName = $this->getMailName($newName); - - $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); - $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); - $folderService = $this->getServiceManager()->get('zimbraServiceFolder'); - $filterService = $this->getServiceManager()->get('zimbraServiceFilter'); - $rightService = $this->getServiceManager()->get('zimbraServiceRight'); - $identityService = $this->getServiceManager()->get('zimbraServiceIdentity'); - - // Travail sur la boite utilisateur - $userAccount = $accountService->get($userMail); - $folderService->setAccount($userAccount); + $afName = $this->getMailName($adresseFonctionnelle); + $afNewName = $this->getMailName($newName); + + $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); + $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); + $folderService = $this->getServiceManager()->get('zimbraServiceFolder'); + $filterService = $this->getServiceManager()->get('zimbraServiceFilter'); + $rightService = $this->getServiceManager()->get('zimbraServiceRight'); + $identityService = $this->getServiceManager()->get('zimbraServiceIdentity'); + + // Travail sur la boite utilisateur + $userAccount = $accountService->get($userMail); + $folderService->setAccount($userAccount); $filterService->setAccount($userAccount); $identityService->setAccount($userAccount); - - // Répertoires - $inputFolder = $folderService->rename($inputFolder = $folderService->get($afName.' | Réception'), $afNewName.' | Réception'); - $sentFolder = $folderService->rename($sentFolder = $folderService->get($afName.' | Envoi'), $afNewName.' | Envoi'); - - // Filtre sortant - $filter = new Filter; -// $filter = $filterService->getOutput()[$afName.' | Envoi']; - $filter->setName($afNewName.' | Envoi'); - $test = new FilterTestAddress(); - $test->setHeader('from')->setStringComparison('contains')->setPart('all') - ->setValue($newName); - $filter->setTests(array($test)); - - $action = new FilterActionFileInto; - $action->setFolderPath( $afNewName.' | Envoi' ); + + // Répertoires + $inputFolder = $folderService->rename($inputFolder = $folderService->get($afName . ' | Réception'), $afNewName . ' | Réception'); + $sentFolder = $folderService->rename($sentFolder = $folderService->get($afName . ' | Envoi'), $afNewName . ' | Envoi'); + + // Filtre sortant + $filter = new Filter; +// $filter = $filterService->getOutput()[$afName.' | Envoi']; + $filter->setName($afNewName . ' | Envoi'); + $test = new FilterTestAddress(); + $test->setHeader('from')->setStringComparison('contains')->setPart('all') + ->setValue($newName); + $filter->setTests([$test]); + + $action = new FilterActionFileInto; + $action->setFolderPath($afNewName . ' | Envoi'); $filter->addAction($action); - - $filterService->deleteOutput($afName.' | Envoi'); - $filterService->createOutput($filter); - - // ACE - $newAce = new Right(); - $newAce->setTarget($distribListService->get($newName)) - ->setGrantee($userAccount) - ->setRightByRightName('sendAsDistList'); - $rightService->grantRight($newAce); - - // Avatar - $identityService->delete($identityService->get($afName)); // suppression ancienne identité - $identity = new Identity(); + + $filterService->deleteOutput($afName . ' | Envoi'); + $filterService->createOutput($filter); + + // ACE + $newAce = new Right(); + $newAce->setTarget($distribListService->get($newName)) + ->setGrantee($userAccount) + ->setRightByRightName('sendAsDistList'); + $rightService->grantRight($newAce); + + // Avatar + $identityService->delete($identityService->get($afName)); // suppression ancienne identité + $identity = new Identity(); $identity->setName($afNewName); $identity->zimbraPrefFromAddress = $newName; - $identity->zimbraPrefFromAddressType = 'sendAs'; + $identity->zimbraPrefFromAddressType = 'sendAs'; $identity->zimbraPrefFromDisplay = $afNewName; - $identity->zimbraPrefWhenInFolderIds = $folderService->get($afNewName.' | Réception')->getId(); - $identity->zimbraPrefWhenInFoldersEnabled = true; + $identity->zimbraPrefWhenInFolderIds = $folderService->get($afNewName . ' | Réception')->getId(); + $identity->zimbraPrefWhenInFoldersEnabled = true; $identity->zimbraPrefReplyToAddress = $newName; - $identity->zimbraPrefReplyToEnabled = true; + $identity->zimbraPrefReplyToEnabled = true; $identity->zimbraPrefWhenSentToAddresses = $newName; - $identity->zimbraPrefWhenSentToEnabled = true; + $identity->zimbraPrefWhenSentToEnabled = true; $identityService->create($identity); - - return $this; + + return $this; } /** @@ -443,8 +450,8 @@ class BoiteGenerique extends Processus * @param string $mail * @return string */ - private function getMailName( $mail ) + private function getMailName($mail) { - return substr( $mail, 0, strrpos($mail,'@')); + return substr($mail, 0, strrpos($mail, '@')); } } \ No newline at end of file