Pagina 1 di 1

inviare mail da script su relay puntuale in smtps

Inviato: gio 27 ott 2011, 15:41
da ZeroUno
Salve.

Ho dei sistemi da cui devo inviare mail da script.
Queste macchine non hanno accesso a internet ma ho un relay interno a cui farle puntare.
Il problema però è che questo funziona solo in ssl su porta 465

Una mail normale la invio con 'mail' o 'mailx', ma questi non mi consentono di specificare il mail server.
Allora modifico sendmail.cf mettendo 'DSmiomailserver'
ma non riesco a specificare la porta e, tantomeno, a specificargli che deve andare in ssl (non starttls)
o meglio
con mailx di slackware sembra che si può (con qualche parametro aggiunto con -S)
ma il server che ho è redhat e la versione di mailx presente non accetta questo parametro.

Come posso fare?

Re: inviare mail da script su relay puntuale in smtps

Inviato: gio 27 ott 2011, 15:48
da krisis
Soluzione facile e veloce :
Installi e configuri ssmtp sulle macchine dalle quali devi spedire le mail.
Soluzione meno facile e veloce :
Installi e configuri un server smtp su ogni macchina.

Re: inviare mail da script su relay puntuale in smtps

Inviato: gio 27 ott 2011, 16:26
da masalapianta
teoricamente, visto che le mail le devi inviare da script, potresti anche mandare comandi smtp e mail in pipe ad openssl:

echo -e "EHLO `hostname`\nMAIL FROM: blablabla" | openssl s_client -connect ipdelrelay:465 -quiet

tieni comunque conto che così invii "alla cieca", non hai riscontri sugli status code che ti ritorna il relay per tutto quello che gli mandi.

Re: inviare mail da script su relay puntuale in smtps

Inviato: gio 27 ott 2011, 17:39
da ZeroUno
Alla fine me lo sono costruito da solo.
Se può servirvi:

Codice: Seleziona tutto

#!/bin/bash


#### DEFAULT VALUE

DOMAIN=${DOMAIN:-mydomain} # will be overwritten by the -E parameter
RELAY=${RELAY:-smtps://myrelay:465}  # will be overwitten by the -R parameter

#### DOES NOT TOUCH

function usage(){
echo "
        Usage: 
                $0 [-s <subject>] [-c <cc-address>] [-b <bcc-address>] [-r <from-address>] [-R <relay>] [-E <EHLO>] [-H <header: value>] [-I <messageid>] <to-address> <to-address> ...

        -s <subject>    Specify subject
        -b <address>    Send blind carbon copies to list.  List should be a comma-separated list of names.
        -c <address>    Send carbon copies to list of users.
        -r <address>    Sets the From address.
        -R <relay>      Specify the relay host in format smtp://ip:port or smtps://ip:port
        -I <messageid>  Force message id
        -E <EHLO>       Set EHLO (host.domain)
        -H <header: value> Add an header. To specify two header use another -H parameter
"
}
while [ $# -gt 0 ];do
        case $1 in
                "-s") SUBJECT="$2";shift 2;;
                "-b") BCC=$(echo $2|sed 's/,/ /g');shift 2;;
                "-c") CC=$(echo $2|sed 's/,/ /g');shift 2;;
                "-r") FROM="$2";shift 2;;
                "-R") RELAY="$2";shift 2;;
                "-I") MESSAGEID="$2";shift 2;;
                "-E") EHLO="$2";shift 2;;
                "-H") HEADER="$HEADER$2\\n";shift 2;;
                -*) echo "$1 non riconosciuto";usage;exit;;
                *) TO="$TO $1";shift;;
        esac
done
if [ -z "$TO" ];then usage;exit;fi
EHLO=${EHLO:-"`hostname`.$DOMAIN"}
FROM=${FROM:-"`whoami`@$EHLO"}
MESSAGEID=${MESSAGEID:-"`date +%s`@$EHLO"}
RCPTTO="$TO $CC $BCC"

PROTO=$(echo $RELAY|sed -r 's#^(smtps?)://.*#\1#')
PORT=$(echo $RELAY|sed -r 's#^smtps?://.*:([0-9]+)#\1#')
RELAY=$(echo $RELAY|sed -r 's#^smtps?://([^:]*):.*#\1#')

(
        echo "EHLO $HOST"
        echo "MAIL FROM: <$FROM>"
        for RCPT in $RCPTTO;do
                echo "RCPT TO: <$RCPT>"
        done
        echo "DATA"
        echo "Subject: $SUBJECT"
        echo "From: $FROM"
        echo "To: $(echo $TO|sed 's/ /,/g')"
        [ ! -z "$CC" ]&&echo "CC: $(echo $CC|sed 's/ /,/g')"
        echo "Message-Id: $MESSAGEID"
        echo -en "$HEADER"
        echo ""
        cat
        echo "."
        echo "QUIT"
)|(
        if [ "$PROTO" == "smtps" ];then
                openssl s_client -ign_eof -connect $RELAY:$PORT -quiet
        else
                nc $RELAY $PORT
        fi
)
sembra funzionare.