/**
  * Instantiates the requisite Mailer and returns it.
  *
  * @static
  * @access private
  * @param OutboundEmailConfiguration $config          required Must be an OutboundEmailConfiguration or a type that derives
  *                                                    from it.
  * @return mixed An object of one of the Mailers defined in $modeToMailerMap.
  * @throws MailerException
  */
 private static function buildMailer(OutboundEmailConfiguration $config)
 {
     $mode = $config->getMode();
     $strategy = static::getStrategy($mode);
     $mailer = null;
     if (is_null($strategy)) {
         throw new MailerException("Invalid Mailer: Could not find a strategy for mode '{$mode}'", MailerException::InvalidMailer);
     }
     if (class_exists($strategy)) {
         $mailer = new $strategy($config);
     }
     if (!$mailer instanceof $strategy) {
         throw new MailerException("Invalid Mailer: Could not find the strategy defined by class '{$strategy}'", MailerException::InvalidMailer);
     }
     return $mailer;
 }
 /**
  * @access private
  * @param User          $user           required
  * @param array         $configurations required
  * @param OutboundEmail $outboundEmail  required
  * @param Localization  $locale
  * @param string        $charset
  * @return OutboundEmailConfiguration
  */
 public static function buildOutboundEmailConfiguration(User $user, $configurations, $outboundEmail, Localization $locale = null, $charset = null)
 {
     $outboundEmailConfiguration = null;
     $mode = strtolower($outboundEmail->mail_sendtype);
     // setup the mailer's known configurations based on the type of mailer
     switch ($mode) {
         case self::MODE_SMTP:
             $outboundEmailConfiguration = new OutboundSmtpEmailConfiguration($user);
             $outboundEmailConfiguration->setHost($outboundEmail->mail_smtpserver);
             $outboundEmailConfiguration->setPort($outboundEmail->mail_smtpport);
             if ($outboundEmail->mail_smtpauth_req) {
                 // require authentication with the SMTP server
                 $outboundEmailConfiguration->setAuthenticationRequirement(true);
                 $outboundEmailConfiguration->setUsername($outboundEmail->mail_smtpuser);
                 $outboundEmailConfiguration->setPassword($outboundEmail->mail_smtppass);
             }
             // determine the appropriate encryption layer for the sending strategy
             if ($outboundEmail->mail_smtpssl == 1) {
                 $outboundEmailConfiguration->setSecurityProtocol(OutboundSmtpEmailConfiguration::SecurityProtocolSsl);
             } elseif ($outboundEmail->mail_smtpssl == 2) {
                 $outboundEmailConfiguration->setSecurityProtocol(OutboundSmtpEmailConfiguration::SecurityProtocolTls);
             }
             break;
         default:
             $outboundEmailConfiguration = new OutboundEmailConfiguration($user);
             break;
     }
     $outboundEmailConfiguration->setMode($mode);
     // hostname for SMTP HELO
     $hostname = !empty($GLOBALS['sugar_config']['helo_hostname']) ? $GLOBALS['sugar_config']['helo_hostname'] : $GLOBALS['sugar_config']['host_name'];
     $outboundEmailConfiguration->setHostname($hostname);
     if (!empty($configurations["config_id"])) {
         $outboundEmailConfiguration->setConfigId($configurations["config_id"]);
     }
     if (!empty($configurations["config_type"])) {
         $outboundEmailConfiguration->setConfigType($configurations["config_type"]);
     }
     if (!empty($outboundEmail->name)) {
         $outboundEmailConfiguration->setConfigName($outboundEmail->name);
     }
     if (!empty($configurations["inbox_id"])) {
         $outboundEmailConfiguration->setInboxId($configurations["inbox_id"]);
     }
     if (!empty($configurations["inbound_ids"])) {
         $outboundEmailConfiguration->setInboundIds($configurations["inbound_ids"]);
     }
     if (!empty($configurations["from_email"])) {
         $outboundEmailConfiguration->setFrom($configurations["from_email"], $configurations["from_name"]);
     }
     if (!empty($configurations["display_name"])) {
         $outboundEmailConfiguration->setDisplayName($configurations["display_name"]);
     }
     if (!empty($configurations["replyto_email"])) {
         $outboundEmailConfiguration->setReplyTo($configurations["replyto_email"], $configurations["replyto_name"]);
     }
     if (!is_bool($configurations["personal"])) {
         $configurations["personal"] = $configurations["personal"] ? true : false;
     }
     $outboundEmailConfiguration->setPersonal($configurations["personal"]);
     if (is_null($locale)) {
         $locale = $GLOBALS["locale"];
     }
     $outboundEmailConfiguration->setLocale($locale);
     if (is_null($charset)) {
         $charset = $locale->getPrecedentPreference("default_email_charset");
     }
     $outboundEmailConfiguration->setCharset($charset);
     return $outboundEmailConfiguration;
 }
 /**
  * @access public
  * @return array
  */
 public function toArray()
 {
     $fields = array("host" => $this->getHost(), "port" => $this->getPort(), "authenticate" => $this->isAuthenticationRequired(), "securityProtocol" => $this->getSecurityProtocol(), "username" => $this->getUsername(), "password" => $this->getPassword());
     return array_merge(parent::toArray(), $fields);
 }