/**
  * @access public
  * @param User         $user    required
  * @param Localization $locale
  * @param string       $charset
  * @return array MailConfigurations
  * @throws MailerException
  */
 public static function listMailConfigurations(User $user, Localization $locale = null, $charset = null)
 {
     global $app_strings;
     $outboundEmailConfigurations = array();
     $ret = $user->getUsersNameAndEmail();
     $systemDefaultOutbound = null;
     if (empty($ret['email'])) {
         $systemReturn = $user->getSystemDefaultNameAndEmail();
         $ret['email'] = $systemReturn['email'];
         $ret['name'] = $systemReturn['name'];
         $system_replyToAddress = $ret['email'];
     } else {
         $system_replyToAddress = '';
     }
     $system_replyToName = $ret['name'];
     $replyTo = $user->emailAddress->getReplyToAddress($user, true);
     if (!empty($replyTo)) {
         $system_replyToAddress = $replyTo;
     }
     /* Retrieve any Inbound User Mail Accounts and the Outbound Mail Accounts Associated with them */
     $inboundEmail = new InboundEmail();
     $ieAccounts = $inboundEmail->retrieveAllByGroupIdWithGroupAccounts($user->id);
     $ie_ids = array_keys($ieAccounts);
     foreach ($ieAccounts as $inbox_id => $ie) {
         $name = $ie->get_stored_options('from_name');
         $addr = $ie->get_stored_options('from_addr');
         $storedOptions = unserialize(base64_decode($ie->stored_options));
         $isAllowedGroup = $ie->get_stored_options('allow_outbound_group_usage', false);
         if (!$ie->is_personal && !$isAllowedGroup) {
             continue;
         }
         $outbound_config_id = empty($storedOptions["outbound_email"]) ? null : $storedOptions["outbound_email"];
         $oe = null;
         if (!empty($outbound_config_id)) {
             $oe = static::loadOutboundEmail();
             $oe->retrieve($outbound_config_id);
         } else {
             if (empty($systemDefaultOutbound)) {
                 $systemDefaultOutbound = self::getSystemMailConfiguration($user, $locale, $charset);
             }
             $outbound_config_id = $systemDefaultOutbound->getConfigId();
             $oe = static::loadOutboundEmail();
             $oe->retrieve($outbound_config_id);
         }
         if ($name != null && $addr != null && !empty($outbound_config_id) && !empty($oe) && $outbound_config_id == $oe->id) {
             // turn the OutboundEmail object into a useable set of mail configurations
             $configurations = array();
             $configurations["config_id"] = $outbound_config_id;
             $configurations["config_type"] = "user";
             $configurations["inbox_id"] = $inbox_id;
             $configurations["from_email"] = $addr;
             $configurations["from_name"] = $name;
             if ($isAllowedGroup) {
                 $configurations["display_name"] = "{$name} ({$addr}) - [" . $app_strings['LBL_GROUP_EMAIL_ACCOUNT_CONFIGURATION'] . "]";
             } else {
                 $configurations["display_name"] = "{$name} ({$addr}) - [" . $app_strings['LBL_USER_OUTBOUND_EMAIL_ACCOUNT_CONFIGURATION'] . "]";
             }
             $configurations["personal"] = (bool) $ie->is_personal;
             $configurations["replyto_email"] = !empty($storedOptions["reply_to_addr"]) ? $storedOptions["reply_to_addr"] : $addr;
             $configurations["replyto_name"] = !empty($storedOptions["reply_to_name"]) ? $storedOptions["reply_to_name"] : $name;
             $outboundEmailConfiguration = self::buildOutboundEmailConfiguration($user, $configurations, $oe, $locale, $charset);
             $outboundEmailConfigurations[] = $outboundEmailConfiguration;
         }
     }
     $systemUser = BeanFactory::getBean("Users");
     $systemUser->getSystemUser();
     $oe = static::loadOutboundEmail();
     $systemMailerConfiguration = $oe->getSystemMailerSettings();
     if ($oe->isAllowUserAccessToSystemDefaultOutbound()) {
         $system = $systemMailerConfiguration;
         $personal = false;
     } else {
         $system = $oe->getUsersMailerForSystemOverride($user->id);
         $personal = true;
         if (empty($system)) {
             // Create a User System-Override Configuration
             if ($user->id == $systemUser->id) {
                 $oe = $oe->createUserSystemOverrideAccount($user->id, $systemMailerConfiguration->mail_smtpuser, $systemMailerConfiguration->mail_smtppass);
             } else {
                 $oe = $oe->createUserSystemOverrideAccount($user->id);
             }
             $system = $oe->getUsersMailerForSystemOverride($user->id);
         }
     }
     if (empty($system->id)) {
         throw new MailerException("No Valid Mail Configurations Found", MailerException::InvalidConfiguration);
     }
     // turn the OutboundEmail object into a useable set of mail configurations
     $oe = static::loadOutboundEmail();
     $oe->retrieve($system->id);
     $configurations = array();
     $configurations["config_id"] = $system->id;
     $configurations["config_type"] = "system";
     $configurations["inbox_id"] = null;
     $configurations["from_email"] = $ret["email"];
     $configurations["from_name"] = $ret["name"];
     $configurations["display_name"] = "{$ret['name']} ({$ret['email']}) - [" . ($personal ? $app_strings['LBL_USER_DEFAULT_OUTBOUND_EMAIL_CONFIGURATION'] : $app_strings['LBL_SYSTEM_DEFAULT_OUTBOUND_EMAIL_CONFIGURATION']) . "]";
     $configurations["personal"] = $personal;
     $configurations["replyto_email"] = $system_replyToAddress;
     $configurations["replyto_name"] = $system_replyToName;
     $configurations["inbound_ids"] = $ie_ids;
     $outboundEmailConfiguration = self::buildOutboundEmailConfiguration($user, $configurations, $oe, $locale, $charset);
     $outboundEmailConfigurations[] = $outboundEmailConfiguration;
     return $outboundEmailConfigurations;
 }
 public function retrieveAllByGroupIdWithGroupAccounts($group_id)
 {
     $inboundEmail = new InboundEmail();
     $result = $inboundEmail->retrieveAllByGroupIdWithGroupAccounts($group_id);
     $this->assertTrue(is_array($result));
     foreach ($result as $ie) {
         $this->assertInstanceOf('InboundEmail', $ie);
     }
 }