static HtmlEmail setAuthentication(HtmlEmail email) {
   if (!(CommandsEX.getConf().getString("Email.Username").isEmpty()
       && CommandsEX.getConf().getString("Email.Password").isEmpty())) {
     email.setAuthentication(
         CommandsEX.getConf().getString("Email.Username"),
         CommandsEX.getConf().getString("Email.Password"));
   }
   return email;
 }
	/***
	 * Loads existing chat replacements from the config file and activates event listeners.
	 */
	public Handler_replacechat() {
		// load replacement values from config file
		File playerChatFile = new File(CommandsEX.plugin.getDataFolder(), CommandsEX.getConf().getString("chatReplaceFile"));
		FileListHelper.checkListFile(playerChatFile, "playerchat.txt");
		addReplacementPairs(FileListHelper.loadListFromFile(playerChatFile, FileListHelper.MatchingContext.Chat));
		CommandsEX.plugin.getServer().getPluginManager().registerEvents(this, CommandsEX.plugin);
	}
  /**
   * * INFO - displays text from info.txt
   *
   * @param sender
   * @param args
   * @return
   */
  public static Boolean run(CommandSender sender, String alias, String[] args) {

    // Command Variables
    Player player = (Player) sender;
    String[] infos =
        CommandsEX.getConf()
            .getString("info")
            .replace("{playername}", player.getDisplayName())
            .split("\\{newline\\}");

    for (String info : infos) {
      player.sendMessage(Utils.replaceChatColors(info));
    }

    return true;
  }
 public static void compose(CommandSender sender, String type) {
   if (inProgress(sender.getName())) {
     LogHelper.showWarning("emailAlreadyInProgress", sender);
     return;
   }
   if (type.equalsIgnoreCase("simple")) {
     SimpleEmail email = new SimpleEmail();
     email.setHostName(CommandsEX.getConf().getString("Email.Host"));
     try {
       email.setFrom(CommandsEX.getConf().getString("Email.From"));
     } catch (EmailException e) {
       sendErrorMessage(sender, e);
       return;
     }
     email = setAuthentication(email);
     simpleEmail.put(sender.getName(), email);
   } else if (type.equalsIgnoreCase("attachment")) {
     MultiPartEmail email = new MultiPartEmail();
     email.setHostName(CommandsEX.getConf().getString("Email.Host"));
     try {
       email.setFrom(CommandsEX.getConf().getString("Email.From"));
     } catch (EmailException e) {
       sendErrorMessage(sender, e);
       return;
     }
     email = setAuthentication(email);
     multiEmail.put(sender.getName(), email);
   } else if (type.equalsIgnoreCase("html")) {
     HtmlEmail email = new HtmlEmail();
     email.setHostName(CommandsEX.getConf().getString("Email.Host"));
     try {
       email.setFrom(CommandsEX.getConf().getString("Email.From"));
     } catch (EmailException e) {
       sendErrorMessage(sender, e);
       return;
     }
     email = setAuthentication(email);
     htmlEmail.put(sender.getName(), email);
   }
   LogHelper.showInfo("emailCreated", sender);
 }
	/***
	 * The main function which replaces chat with matched replacements.
	 * @param e
	 * @return
	 */
	@EventHandler(priority = EventPriority.LOWEST)
	public void replaceChat(PlayerChatEvent e) {
		if (e.isCancelled()) return;
		
		try {
			ScriptEnvironment env = new ScriptEnvironment(); {
				env.setCommandSender(e.getPlayer());
				env.setServer(e.getPlayer().getServer());
			}
			ArrayList<ReplacementPair> preparedEffects = new ArrayList<ReplacementPair>(); //holds all effects until all replacements done

			for (ReplacementPair rp : pairs) {
				StringBuffer sb = new StringBuffer();
				Matcher m = rp.getRegex().matcher(e.getMessage());
				if (!m.find()) continue;
				env.setMatcher(m);

				if (rp.playerWillVanish()) { //the player will vanish as a result of this, special handling
					int cutlen = CommandsEX.getConf().getInt("replacements.cutoff.length", 1);
					String cuttext = CommandsEX.getConf().getString("replacements.cutoff.indicator", "--*");
	
					String rep = m.group().substring(0, cutlen).concat(cuttext);
					m.appendReplacement(sb, rep);
					e.setMessage(sb.toString());
					//e.setCancelled(true);
					//e.getPlayer().chat(sb.toString()); //chat first
	
					rp.executeEffects(env); //then execute the replacement
					return;
				}

				//loop through with find/replace
				do { //use do while, due to the find() invocation above
					// test if it is all upper, and replace with all upper (if we have this set up in the regex itself - in config file)
					if (rp.getSameOutputCase() && allUpper && m.group().toUpperCase().equals(m.group())) {
						m.appendReplacement(sb, rp.executeString(env).toUpperCase());
					} else {
						m.appendReplacement(sb, rp.executeString(env));
					}
				} while (m.find());
				m.appendTail(sb);

				if (!preparedEffects.contains(rp)) {
					preparedEffects.add(rp);
				}
				e.setMessage(sb.toString());
			}
			
			//after all replacements are in: execute the effects
			if (!preparedEffects.isEmpty()) {
				//e.setCancelled(true);
				//e.getPlayer().chat(sb.toString()); //chat first
	
				env.setMatcher(null);
				for (ReplacementPair rp : preparedEffects){
					rp.executeEffects(env);
				}
			}
		} catch (Exception ex){
			LogHelper.logSevere("[CommandsEX] " + _("cmdOrChatreplacementFailed", ""));
			LogHelper.logDebug("Message: " + ex.getMessage() + ", cause: " + ex.getCause());
		}
	}
	/***
	 * Returns current config.
	 * @return
	 */
	public static FileConfiguration getConf() {
		return plugin.getConfig();
	}