All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mailster.smtp.SMTPServerConfig Maven / Gradle / Ivy

package org.mailster.smtp;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 * This class holds the configuration options of the
 * {@link SMTPServer}.
 *
 * @author De Oliveira Edouard <[email protected]>
 */
public class SMTPServerConfig {

    /**
     * Server name.
     */
    public static final String NAME = "MailsterSMTP";

    /**
     * Server version
     */
    public static final String VERSION = "1.0.5";

    /**
     * 4 megs by default. The server will buffer incoming messages to disk
     * when they hit this limit in the DATA received.
     */
    public static final int DEFAULT_DATA_DEFERRED_SIZE = 1024 * 1024 * 4;

    /**
     * The default charset is ISO-8859-1.
     */
    public static final Charset DEFAULT_CHARSET = StandardCharsets.ISO_8859_1;

    /**
     * The charset in use. Defaults to DEFAULT_CHARSET.
     */
    private Charset charset = DEFAULT_CHARSET;

    /**
     * The server host name. Defaults to a lookup of the
     * local address.
     */
    private String hostName;

    /**
     * The maximal number of recipients that this server accepts
     * per message delivery request.
     * Default value is set to 1000.
     */
    private int maxRecipients = 1000;

    /**
     * Tells the server if it can announce it's support of TLS.
     * This allow to disable it for clients who doesn't support
     * enough cipher suites andthat won't fallback to unsecured
     * connections.
     * Defaults to true.
     */
    private boolean tLSSupported = true;

    /**
     * The connection backlog. Defaults to 5000.
     */
    private int backlog = 5000;

    /**
     * The socket receive buffer size. Defaults to 128.
     */
    private int receiveBufferSize = 128;

    /**
     * Data limit size before writing it to the disk.
     * Defaults to {@link #DEFAULT_DATA_DEFERRED_SIZE}.
     */
    private int dataDeferredSize = DEFAULT_DATA_DEFERRED_SIZE;


    /**
     * Set a hard limit on the maximum number of connections this server will accept
     * once we reach this limit, the server will gracefully reject new connections.
     * Default is 1000.
     */
    private int maxConnections = 1000;

    /**
     * The timeout for waiting for data on a connection is one minute:
     * 1000 * 60.
     */
    private int connectionTimeout = 1000 * 60;

    protected SMTPServerConfig() {
        try {
            this.hostName = InetAddress.getLocalHost().getCanonicalHostName();
        } catch (UnknownHostException e) {
            this.hostName = "localhost";
        }
    }

    /**
     * Returns the receive buffer size.
     * 

* NOTE: read at each smtp session startup. */ public int getReceiveBufferSize() { return this.receiveBufferSize; } /** * Sets the receive buffer size. */ public void setReceiveBufferSize(int receiveBufferSize) { this.receiveBufferSize = receiveBufferSize; } /** * Get the maximum size in bytes of a single message before it is * dumped to a temporary file. *

* NOTE: read when server starts. */ public int getDataDeferredSize() { return dataDeferredSize; } /** * Set the maximum size in bytes of a single message before it is * dumped to a temporary file. Argument must be a positive power * of two in order to follow the expanding algorithm of * {@link org.apache.mina.core.buffer.IoBuffer} to prevent unnecessary * memory consumption. */ public void setDataDeferredSize(int dataDeferredSize) { if (isPowerOfTwo(dataDeferredSize)) { this.dataDeferredSize = dataDeferredSize; } else { throw new IllegalArgumentException("Argument dataDeferredSize must be a positive power of two"); } } /** * Demonstration : if x is a power of 2, it can't share any bit with x-1. So * x & (x-1) should be equal to 0. To get rid of negative values, we check * that x is higher than 1 (0 and 1 being of course unacceptable values * for a buffer length). * * @param x the number to test * @return true if x is a power of two */ private boolean isPowerOfTwo(int x) { return (x > 1) && (x & (x - 1)) == 0; } /** * Returns the backlog. *

* NOTE: read when server starts. */ public int getBacklog() { return this.backlog; } /** * This is the socket backlog. *

* The backlog argument must be a positive value greater than 0. * If the value passed if equal or less than 0, then the default * value will be assumed. */ public void setBacklog(int backlog) { this.backlog = backlog; } /** * Returns the maximum number of recipients for a single message. *

* NOTE: read each time a RCPT command is issued. */ public int getMaxRecipients() { return this.maxRecipients; } /** * Set the maximum number of recipients for a single message. * If set to -1 then limit is ignored. */ public void setMaxRecipients(int maxRecipients) { this.maxRecipients = maxRecipients; } /** * The name + version of the server software. */ public String getNameVersion() { return NAME + " " + VERSION; } /** * Returs the host name. If set to null, it will return * the 'localhost' string. * * @return the host name that will be reported to SMTP * clients. */ public String getHostName() { if (this.hostName == null) { return "localhost"; } else { return this.hostName; } } /** * The host name that will be reported to SMTP clients */ public void setHostName(String hostName) { this.hostName = hostName; } /** * @return true if server is allowed to announce TLS support. *

* NOTE: read each time a EHLO command is issued. */ public boolean isTLSSupported() { return tLSSupported; } /** * Tells the server to announce or not the TLS support. */ public void setTLSSupported(boolean supported) { this.tLSSupported = supported; } /** * Returns the maximum number of connections. *

* NOTE: read each time a new connection happens. */ public int getMaxConnections() { return this.maxConnections; } /** * Set's the maximum number of connections this server instance will * accept. If set to -1 then limit is ignored. */ public void setMaxConnections(int maxConnections) { this.maxConnections = maxConnections; } /** * Returns the connection timeout. *

* NOTE: read to configure each new session configuration. */ public int getConnectionTimeout() { return this.connectionTimeout; } /** * Set the connection timeout. */ public void setConnectionTimeout(int connectionTimeout) { this.connectionTimeout = connectionTimeout; } /** * Returns the charset in use. *

* NOTE: read when server starts. */ public Charset getCharset() { return charset; } /** * Sets the charset to use. Defaults to {@link #DEFAULT_CHARSET}. */ public void setCharset(Charset charset) { this.charset = charset; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy