#!/bin/bash

function usage {
    echo 'usage: <SERVER> [USERNAME PASSWORD]'
    exit 1
}

function connect_server {
    timeout 2 openssl s_client -starttls smtp -connect "$server:587" -ign_eof 2>/dev/null <<EOF
quit
EOF
}

function auth_server {
    base64=$(echo -ne "\0$username\0$password" | base64)
    openssl s_client -starttls smtp -connect "$server:587" -ign_eof 2>/dev/null <<EOF
ehlo .
auth plain $base64
quit
EOF
}

function check_smtp_connection {
    echo -n "check smtp server <$server> port 587 ... "
    set +e
    if connect_server | grep -q CONNECTED; then
        echo SUCCESSFUL CONNECTION
    else
        echo wrong server connection! && exit 1
    fi
}

function check_smtp_auth {
    echo -n "check smtp authentication <$server> port 587 username=<$username> ... "
    set +e
    output=$(auth_server)
    if echo "$output" | grep -q CONNECTED; then
        if echo "$output" | grep -q "Authentication successful"; then
            echo SUCCESSFUL AUTHENTICATION
        else
            echo wrong username or password! && exit 2
        fi
    else
        echo wrong server connection! && exit 1
    fi
    set -e
}

### MAIN

set -Eeuo pipefail

server=${1:-}
username=${2:-}
password=${3:-}

[[ -z "$server" ]] && usage

if [[ -z "$username" ]]; then
    check_smtp_connection
else
    [[ -z "$password" ]] && usage
    check_smtp_auth
fi
