Semplice rimpiazzo in bash del comando sendmail
Moderatore: Staff
Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
-
- Master
- Messaggi: 1645
- Iscritto il: lun 16 lug 2007, 17:39
- Slackware: 15.0 64bit
- Kernel: 5.15.27
- Desktop: kde
- Località: Roma
Semplice rimpiazzo in bash del comando sendmail
Salve a tutti,
sto scrivendo un piccolo demone per la gestione del solo invio di mail tramite il protocollo stmp.
Il perchè non utilizzi mta esterni o ne installi uno ad-hoc, è piu' che altro per un mio esperimento (oltre a non volermi/potermi sobbarcare al momento l'amministrazione di un server smtp che utilizzerei comunque solo per l'invio e non per la ricezione).
Il demone è pronto e funziona anche piuttosto bene pero' ora volevo integrarlo con i servizi piu' blasonati (php/fail2ban e altri) che tipicamente si appoggiano all'eseguibile sendmail per l'invio.. insomma un po' come fanno tutti gli mta che ho superficialmente studiato, avrei bisogno di crearmi un rimpiazzo per il comando sendmail che funzioni secondo le regole del mio demone.
ora, considerando che ho implementato una coda di messaggi su filesystem, il mio clone di sendmail potrebbe essere un semplice script che piazza dei file in una directory ad-hoc.
ad un rapido sguardo l'utilizzo di sendmail non mi pare troppo complesso,(a parte flag e flagghettini vari che affrontero' caso per caso) nel senso che ho visto che viene inviato nello standard input(fino alla pressione di ctrl-d) il messaggio raw con tutti gli header quindi sostanzialmente a me serve redirezionare lo standard input direttamente in un file che decido io.
putroppo non sono un espertone di bash, mi sapete dare qualche dritta su come fare? mi basta un semplice read all'interno dello script per ottenere lo stesso effetto?
spero di essere stato chiaro
ciau
sto scrivendo un piccolo demone per la gestione del solo invio di mail tramite il protocollo stmp.
Il perchè non utilizzi mta esterni o ne installi uno ad-hoc, è piu' che altro per un mio esperimento (oltre a non volermi/potermi sobbarcare al momento l'amministrazione di un server smtp che utilizzerei comunque solo per l'invio e non per la ricezione).
Il demone è pronto e funziona anche piuttosto bene pero' ora volevo integrarlo con i servizi piu' blasonati (php/fail2ban e altri) che tipicamente si appoggiano all'eseguibile sendmail per l'invio.. insomma un po' come fanno tutti gli mta che ho superficialmente studiato, avrei bisogno di crearmi un rimpiazzo per il comando sendmail che funzioni secondo le regole del mio demone.
ora, considerando che ho implementato una coda di messaggi su filesystem, il mio clone di sendmail potrebbe essere un semplice script che piazza dei file in una directory ad-hoc.
ad un rapido sguardo l'utilizzo di sendmail non mi pare troppo complesso,(a parte flag e flagghettini vari che affrontero' caso per caso) nel senso che ho visto che viene inviato nello standard input(fino alla pressione di ctrl-d) il messaggio raw con tutti gli header quindi sostanzialmente a me serve redirezionare lo standard input direttamente in un file che decido io.
putroppo non sono un espertone di bash, mi sapete dare qualche dritta su come fare? mi basta un semplice read all'interno dello script per ottenere lo stesso effetto?
spero di essere stato chiaro
ciau
-
- Master
- Messaggi: 1645
- Iscritto il: lun 16 lug 2007, 17:39
- Slackware: 15.0 64bit
- Kernel: 5.15.27
- Desktop: kde
- Località: Roma
Re: Semplice rimpiazzo in bash del comando sendmail
mentre scrivevo ho letto che questo tizio ha fatto esattamente quello che serve a me
comunque consigli e suggerimenti sono ben accetti
comunque consigli e suggerimenti sono ben accetti
- targzeta
- Iper Master
- Messaggi: 6628
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: Semplice rimpiazzo in bash del comando sendmail
Esiste il comando 'mail' o non ho capito bene il problema. In pratica invia e riceve posta direttamente utilizzando il demone sendmail.
Se poi vuoi, esiste anche 'mini_sendmail' che è un demone piccolino che rimpiazza sendmail, ovvero si appoggia ad un sendmail attivo su qualche IP e porta, non necessariamente in localhost. Così puoi usare un sendmail di qualche altra macchina ...sempre che ne trovi una.
Emanuele
Se poi vuoi, esiste anche 'mini_sendmail' che è un demone piccolino che rimpiazza sendmail, ovvero si appoggia ad un sendmail attivo su qualche IP e porta, non necessariamente in localhost. Così puoi usare un sendmail di qualche altra macchina ...sempre che ne trovi una.
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
-
- Master
- Messaggi: 1645
- Iscritto il: lun 16 lug 2007, 17:39
- Slackware: 15.0 64bit
- Kernel: 5.15.27
- Desktop: kde
- Località: Roma
Re: Semplice rimpiazzo in bash del comando sendmail
non ho sicuramente spiegato bene il problema, ma partendo dal tuo suggerimento riguardo al comando mail ho trovato la mia soluzione temporanea che si chiama ssmtp
in pratica riassumendo ho un'applicazione php deployata su un po di server. quest'applicazione deve poter anche inviare delle mail ma vorrei evitare il piu' possibile l'onere di installare un mta ad-hoc.
visto che il sistema standard del php per l'invio delle mail si poggia su sendmail mi serviva una soluzione diversa che pero' fosse anche la piu' "naturale" possibile.
percio' ho chiesto come creare in modo semplice un clone bash al comando sendmail.. ho sviluppato una semplice applicazione java che in soldoni costituisca LA SOLA PARTE DI INVIO di un classico server smtp (dato un indirizzo mail risolve il record mx del dominio, contatta il server smtp, invia la mail secondo il protocollo smtp etc etc etc) in questo modo non installo alcun server smtp, ma tramite un semplicissimo demone invio mail senza dovermi appoggiare nemmeno a mta esterni(questa parte è già testata e funzionante).
mi mancava solo creare il collante fra php e questo software percio' avevo bisogno di un clone di sendmail compatibile.
per ora pero', visto che l'applicazione non è ancora matura in tutte le sue parti, ho deciso di optare per il software che ho trovato, che in pratica dovrebbe essere simile al tuo 'mini_sendmail' dato che si appoggia ad un smtp esterno garantendo pero' la compatibilità con i parametri del comando sendmail.
spero che ora sia riuscito a spiegarmi un po' meglio
ciau
in pratica riassumendo ho un'applicazione php deployata su un po di server. quest'applicazione deve poter anche inviare delle mail ma vorrei evitare il piu' possibile l'onere di installare un mta ad-hoc.
visto che il sistema standard del php per l'invio delle mail si poggia su sendmail mi serviva una soluzione diversa che pero' fosse anche la piu' "naturale" possibile.
percio' ho chiesto come creare in modo semplice un clone bash al comando sendmail.. ho sviluppato una semplice applicazione java che in soldoni costituisca LA SOLA PARTE DI INVIO di un classico server smtp (dato un indirizzo mail risolve il record mx del dominio, contatta il server smtp, invia la mail secondo il protocollo smtp etc etc etc) in questo modo non installo alcun server smtp, ma tramite un semplicissimo demone invio mail senza dovermi appoggiare nemmeno a mta esterni(questa parte è già testata e funzionante).
mi mancava solo creare il collante fra php e questo software percio' avevo bisogno di un clone di sendmail compatibile.
per ora pero', visto che l'applicazione non è ancora matura in tutte le sue parti, ho deciso di optare per il software che ho trovato, che in pratica dovrebbe essere simile al tuo 'mini_sendmail' dato che si appoggia ad un smtp esterno garantendo pero' la compatibilità con i parametri del comando sendmail.
spero che ora sia riuscito a spiegarmi un po' meglio
ciau
- targzeta
- Iper Master
- Messaggi: 6628
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: Semplice rimpiazzo in bash del comando sendmail
Sì, tutto chiaro. Dalle specifiche sembra essere proprio uguale a mini_sendmail, che io ho installato qui su Slacky dato che il nostro server apache è in chroot jail e mi serviva un modo per far comunicare php con il vero server sendmail.
Emanuele
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
-
- Master
- Messaggi: 1645
- Iscritto il: lun 16 lug 2007, 17:39
- Slackware: 15.0 64bit
- Kernel: 5.15.27
- Desktop: kde
- Località: Roma
Re: Semplice rimpiazzo in bash del comando sendmail
infatti non so se ho capito male io la home, ma il mini_sendmail non l'ho poi utilizzato perchè apparentemente sembrava volesse collegarsi comunque ad un sendmail.
al momento invece sto utilizzato ssmtp con l'smtp di gmail e devo dire che una volta configurato, un sacco di servizi e servizietti che inviano mail di alert (fail2ban e affini) funzionano out-of-the box.
grazie ancora per gli spunti
al momento invece sto utilizzato ssmtp con l'smtp di gmail e devo dire che una volta configurato, un sacco di servizi e servizietti che inviano mail di alert (fail2ban e affini) funzionano out-of-the box.
grazie ancora per gli spunti
-
- Master
- Messaggi: 1645
- Iscritto il: lun 16 lug 2007, 17:39
- Slackware: 15.0 64bit
- Kernel: 5.15.27
- Desktop: kde
- Località: Roma
Re: Semplice rimpiazzo in bash del comando sendmail
Offtopic: volevo riportare la mia esperienza con ssmtp scrivendo un micro tutorial qui sul wiki(e magari poi riportarlo pure sulla neonata documentazione ufficiale). se siete d'accordo a chi devo chiedere affinche abbia i diritti giusti per farlo!???!
inoltre non l'ho trovato ma se c'e' un format che è meglio seguire (una traccia o comunque un qualche slacky's way) me la potreste indicare?
ciau
inoltre non l'ho trovato ma se c'e' un format che è meglio seguire (una traccia o comunque un qualche slacky's way) me la potreste indicare?
ciau
- targzeta
- Iper Master
- Messaggi: 6628
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: Semplice rimpiazzo in bash del comando sendmail
Offtopic: Ti ho aggiunto al gruppo wiki del forum. Prova a vedere se riesci a loggarti anche nella homepage di Slacky (stesse credenziali). Ora non ricordo se c'è uno stile ufficiale sulla documentazione. Quando crei un nuovo articolo, però, troverai due link a mediawiki, io in genere seguo quelli.
Unica nota, se vuoi fare riferimenti interni alla wiki, usa [[articolo]] oppure [[articolo|nome alternativo]] e non cose come http://www.slacky....
Emanuele
Unica nota, se vuoi fare riferimenti interni alla wiki, usa [[articolo]] oppure [[articolo|nome alternativo]] e non cose come http://www.slacky....
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
-
- Master
- Messaggi: 1645
- Iscritto il: lun 16 lug 2007, 17:39
- Slackware: 15.0 64bit
- Kernel: 5.15.27
- Desktop: kde
- Località: Roma
Re: Semplice rimpiazzo in bash del comando sendmail
Offtopic: Grazie 1000... funziona
per quanto riguarda le guide seguiro' il tuo consiglio
grazie ancora
per quanto riguarda le guide seguiro' il tuo consiglio
grazie ancora
-
- Master
- Messaggi: 1645
- Iscritto il: lun 16 lug 2007, 17:39
- Slackware: 15.0 64bit
- Kernel: 5.15.27
- Desktop: kde
- Località: Roma
Re: Semplice rimpiazzo in bash del comando sendmail
riprendo questo post per chiedere una mano ai maestri della shell
utilizzando ssmtp come rimpiazzo diretto a sendmail ( un brutale link simbolico) la mia applicazione php rallenta il tempo necessario alla transazione smtp(che è di circa un paio di secondi).
percio' riprendendo un po' l'esigenza originale del post ho scritto questo semplice script(prendendo spunto da qui) che andro' a sostituire al binario /usr/sbin/sendmail
questo script nn fa altro che, ad ogni chiamata al binario sendmail (nel mio caso il php) creare all'interno di una directory temporanea un file con, per esempio, questo contenuto
come potete notare i file cosi' creati sono degli script veri e propri che inviano la mail tramite il binario ssmtp
fatto questo ho messo in cron ogni minuto quest'altro semplicissimo script
che nn fa altro che scansionare la directory con tutti gli script mail creati e li esegue in background.
ho fatto un po' di prove e il tutto funziona 'onestamente'.. pero' chiedo il vostro aiuto per lo spooler (l'ultimo script per intenderci) per
1) limitare il numero di processi lanciati in background in modo che se ci sono 10..100..1000 mail non si ingolfi il sistema. avevo pensato ad unda utilizzare per contare i processi già forkati ma non saprei se è la strada migliore
2) loggare su un file in un formato simile a quelli utilizzato per i log di sistema (ho dato uno sguardo al binario logger, ma mi pare che quello loggi sul log di sistema, a me invece servirebbe un log ad-hoc)
3) eventuali accorgimenti / miglioramenti tenendo conto che soprattutto l'ultimo script è ancora una bozza
grazie in anticipo
utilizzando ssmtp come rimpiazzo diretto a sendmail ( un brutale link simbolico) la mia applicazione php rallenta il tempo necessario alla transazione smtp(che è di circa un paio di secondi).
percio' riprendendo un po' l'esigenza originale del post ho scritto questo semplice script(prendendo spunto da qui) che andro' a sostituire al binario /usr/sbin/sendmail
Codice: Seleziona tutto
#!/bin/bash
LOGDIR=/tmp/sendmail-sim
NOW=$(date +%Y%m%dT%H%M)
CNT=1
FILENAME="$LOGDIR/$NOW.$CNT.mail"
while [ -f $FILENAME ]; do
CNT=$(($CNT + 1))
FILENAME="$LOGDIR/$NOW.$CNT.mail"
done
echo "/usr/sbin/ssmtp $* << EOF" >> $FILENAME
cat - >> $FILENAME
echo "EOF" >> $FILENAME
exit 0
Codice: Seleziona tutto
/usr/sbin/ssmtp -t -i << EOF
To: xxxxxxx@xxxxx.com
Subject: test
X-PHP-Originating-Script: 1000:functions.inc.php
From: xxxxxxxx@xxxxxx.com
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary = 10983184325068cde89b4454.43655820
This is a MIME encoded message.
--10983184325068cde89b4454.43655820
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: base64
--10983184325068cde89b4454.43655820
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: base64
Q2lhbyBwaXBwbw==
EOF
fatto questo ho messo in cron ogni minuto quest'altro semplicissimo script
Codice: Seleziona tutto
#!/bin/sh
for i in `ls *.mail`
do
(
name=`basename $i .mail`
echo "send mail $i"
/bin/sh $i 2>$name.error
RETVAL=$?
[ $RETVAL -eq 0 ] && echo "ok" && rm $name.error && mv $i $i.sent
[ $RETVAL -ne 0 ] && echo "failed"
) &
done
ho fatto un po' di prove e il tutto funziona 'onestamente'.. pero' chiedo il vostro aiuto per lo spooler (l'ultimo script per intenderci) per
1) limitare il numero di processi lanciati in background in modo che se ci sono 10..100..1000 mail non si ingolfi il sistema. avevo pensato ad un
Codice: Seleziona tutto
ps aux | grep ssmtp | wc -l
2) loggare su un file in un formato simile a quelli utilizzato per i log di sistema (ho dato uno sguardo al binario logger, ma mi pare che quello loggi sul log di sistema, a me invece servirebbe un log ad-hoc)
3) eventuali accorgimenti / miglioramenti tenendo conto che soprattutto l'ultimo script è ancora una bozza
grazie in anticipo
-
- Master
- Messaggi: 1645
- Iscritto il: lun 16 lug 2007, 17:39
- Slackware: 15.0 64bit
- Kernel: 5.15.27
- Desktop: kde
- Località: Roma
Re: Semplice rimpiazzo in bash del comando sendmail
ci ho giocato ancora un po' ed ecco lo script finale che scoda da filesystem con controllo di numero massimo di processi
il controllo dei processi l'ho fatto utilizzando ps e contando le linee risultanti.
lo script dovrebbe essere thread safe in quanto ad ogni lancio viene creata una nuova directory in base al PID, all'interno della quale vengono poi spostate le mail presenti in quel momento nella coda. per garantire l'esclusività di questa operazione viene creato un file di lock.
percio' se per caso lo script impiega piu' tempo del dovuto e ne dovesse partire un altro (ricordo che questo script è in cron periodico) non si dovrebbero intrecciare e inviare mail doppie.
mi resta solo da trovare un modo decente per loggare le attività e gli errori e dovrebbe essere grosso modo finito
come posso fare?
ciau
Codice: Seleziona tutto
#!/bin/sh
. /etc/ssmtpooler
MAILDIR=$BASEDIR/out-queue
PROCDIR=$BASEDIR/proc-queue/$$
for i in 1 2 3 4 5 6 7 8 9 10
do
if [ ! -f $BASEDIR/lock ]; then
touch $BASEDIR/lock #simple lock to avoid concurrency during moving mails to process queue
mkdir -p $PROCDIR
mails=`ls $MAILDIR/*.mail`
#move mail to process queue
for i in $mails
do
mv $i $PROCDIR/`basename $i`
done
rm $BASEDIR/lock # release lock
#process queue
for x in $mails
do
(
name=`basename $x`
# copy mail to temporary file
tmp=`mktemp /tmp/ssmtpooler.XXXXXX`
cat $PROCDIR/$name > $tmp
# send mail
/bin/sh $tmp
RETVAL=$?
[ $RETVAL -eq 0 ] && echo "ok"
[ $RETVAL -ne 0 ] && echo "failed" && mv $tmp $MAILDIR/$name # in case of error move again to original queue
[ -f $tmp ] && rm $tmp
) &
nfork=`ps aux | grep ssmtp | grep -v grep | wc -l`
while [ $nfork -gt 10 ]
do
sleep 1
nfork=`ps aux | grep ssmtp | grep -v grep | wc -l`
done
done
#clean process queue
rm -r $PROCDIR
exit 0;
fi
sleep 1
done
exit 1
lo script dovrebbe essere thread safe in quanto ad ogni lancio viene creata una nuova directory in base al PID, all'interno della quale vengono poi spostate le mail presenti in quel momento nella coda. per garantire l'esclusività di questa operazione viene creato un file di lock.
percio' se per caso lo script impiega piu' tempo del dovuto e ne dovesse partire un altro (ricordo che questo script è in cron periodico) non si dovrebbero intrecciare e inviare mail doppie.
mi resta solo da trovare un modo decente per loggare le attività e gli errori e dovrebbe essere grosso modo finito
come posso fare?
ciau
-
- Master
- Messaggi: 1645
- Iscritto il: lun 16 lug 2007, 17:39
- Slackware: 15.0 64bit
- Kernel: 5.15.27
- Desktop: kde
- Località: Roma
Re: Semplice rimpiazzo in bash del comando sendmail
ho risolto. in pratica utilizzo il binario logger e configuro il demone syslog per redirezionare i logs dello script su un file separatomiklos ha scritto:mi resta solo da trovare un modo decente per loggare le attività e gli errori e dovrebbe essere grosso modo finito
come posso fare?
prevedo un nuovo articolo sul wiki