code: @SuppressWarnings("WeakerAccess")
  	public static Session createMailSession(@Nonnull final ServerConfig serverConfig, @Nonnull final TransportStrategy transportStrategy) {
  		final Properties props = transportStrategy.generateProperties();
  		props.put(transportStrategy.propertyNameHost(), serverConfig.getHost());
  		props.put(transportStrategy.propertyNamePort(), String.valueOf(serverConfig.getPort()));
  		
  		if (serverConfig.getUsername() != null) {
  			props.put(transportStrategy.propertyNameUsername(), serverConfig.getUsername());
  		}
  		
  		if (serverConfig.getPassword() != null) {
  			props.put(transportStrategy.propertyNameAuthenticate(), "true");
  			return Session.getInstance(props, new SmtpAuthenticator(serverConfig));
  		} else {
  			return Session.getInstance(props);
  		}
  	}
docs: Instantiates and configures the {@link Session} instance. Delegates resolving transport protocol specific properties to the given {@link
  TransportStrategy} in two ways: <ol> <li>request an initial property list which the strategy may pre-populate</li> <li>by requesting the
  property names according to the respective transport protocol it handles (for the host property for example it would be
  <em>"mail.smtp.host"</em> for SMTP and <em>"mail.smtps.host"</em> for SMTPS)</li> </ol>
  <p>
  Furthermore adds proxy SOCKS properties if a proxy configuration was provided, overwriting any SOCKS properties already present.
  
  @param serverConfig      Remote SMTP server details.
  @param transportStrategy The transport protocol strategy enum that actually handles the session configuration. Session configuration meaning
  setting the right properties for the appropriate transport type (ie. <em>"mail.smtp.host"</em> for SMTP,
  <em>"mail.smtps.host"</em> for SMTPS).
  
  @return A fully configured <code>Session</code> instance complete with transport protocol settings.
  @see TransportStrategy#generateProperties()
  @see TransportStrategy#propertyNameHost()
  @see TransportStrategy#propertyNamePort()
  @see TransportStrategy#propertyNameUsername()
  @see TransportStrategy#propertyNameAuthenticate()