private Optional<String> readCommandLine() throws IOException {
        try {
            return Optional.ofNullable(this.reader.readLine());
        } catch (final SocketException ex) {
            // Lots of clients just "hang up" rather than issuing QUIT,
            // which would
            // fill our logs with the warning in the outer catch.
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("Error reading client command: " + ex.getMessage(), ex);
            }
            return Optional.empty();
        }
    }
Sends the welcome message and starts receiving and processing client
commands. It quits when {@link #quitting} becomes true or when it can be
noticed or at least assumed that the client no longer sends valid commands,
for example on timeout.

@throws IOException if sending to or receiving from the client fails.
src/main/java/de/gessnerfl/fakesmtp/smtp/server/Session.java