Newsgroup: it.comp.software.mailreader
Titolo: [Hamster]script per server smtp

Ho realizzato (da principante) questo piccolo script che individua la 
connessione di accesso remoto al momento attiva e si collega al relativo 
server smtp. 
Occorre pero' definire un file "smtp.txt" da inserire nella diretory di 
hamster, che contiene per ogni riga il nome della connessione di accesso 
remoto + spazio + il relativo smtp server.
esempio di smtp.txt (senza righe vuote all'inizio)
libero 
mail.libero.it
worldonline 
smpt.worldonline.it
interfree 
mail.interfree.it
tin 
mail.tin.it
lo script "inviaPosta.hsc" e' il seguente:
#!hs2
var( $coll,$collattivo,$linea,$smptsrv) 
var( $lista,$i,$inviata,$trovato) 
hamwaitidle
if (!fileexists(hampath + "mails\mail.out\*.msg" ))
    warning ("Non c'e' posta da spedire")
    quit
endif
if (!fileExists("smtp.txt"))
	warning ("File smtp.txt mancante")	
	quit
endif
if (RasIsConnected)
	$collattivo=RasGetConnection
else
	warning ("Invio posta non effettuato_
per mancanza di un collegamento")
	quit
endif
$lista = listalloc()
listload($lista,"smtp.txt")
$trovato=0
$inviata=1
for ($i,0,listcount($lista)-1)
	$linea=	listget($lista,$i)
	RE_Split ($linea, " +", $coll, $smptsrv)
	if ($coll=$collattivo)
		$trovato=1
		$inviata=HamSendMail ($smptsrv )
		hamwaitidle
		break
	endif
endfor
if ($trovato=0)
	warning("Collegamento ad accesso remoto: "_
 , $collattivo , " non trovato nel file smtp.txt")
endif
if ($inviata<>0)
	warning ("Processo per invio posta non avviato")
endif
listfree($lista)
quit
Sinceramente non credo che serva a molto, a meno che non venga richiamato
da un altro script che ogni tot minuti cerca di inviare la posta in
coda, altrimenti sincronizzandosi manualmente con il server smtp del
provider con cui si e' al momento connessi, si ottiene la stessa cosa (a
livello di numero di click).
Questo e' il mio primo script, quindi se qualche esperto volesse fare 
delle correzioni, che ben venga.
Ciao
Sandro

Mi e' sfuggito che il nome di una connessone ad accesso remoto puo'
contenere spazi. 
Conviene allora che il file smtp.txt sia della forma:
nome connessione::nome server
esempio:
libero::
mail.libero.it
worldonline::
smpt.worldonline.it
Connessione a interfree::
mail.interfree.it
tin::
mail.tin.it
e bisogna sostiuire nello script la riga:
	RE_Split ($linea, " +", $coll, $smptsrv)
con la seguente:
	RE_Split ($linea, "::", $coll, $smptsrv)
Sandro

server smtp.
Salve!
Se, in un normalissimo script, tu inserisci in sequenza:
hamsendmail( "server1", "smtp" )
hamsendmail( "server2", "smtp" )
hamsendmail( "server3", "smtp" )
...
ci pensa Haster a spedire con un server accessibile, a seconda 
della connessione di quel momento. :)
-- 
Bye.
       Lem
----------------- 'CLOCK is what you make of it' -----------------
Distributed computing projects: 
www.nyx.net/~kpearson/distrib.html

della connessione di quel momento. :)
Ciao
Ti rispondo chiedendoti anticipatamente scusa per la pignoleria.
Da quanto ho potuto constatare, si, ci pensa hamster a spedire, ma non in
modo tanto elegante, cioe' hamster tenta di collegarsi col primo server,
se non ci riesce manda vari avvisi e messaggi di errore, poi tenta col
secondo, se non riesce idem, altri messaggi di errore,  fino a quando un
server gli permette il post. Dopo di che continua inutilmente con gli
altri server, dando pero' il messaggio che non c'e' posta da spedire.(lui
fa quello che gli si chiede). 
Alla fine ti ritrovi con la finetra piena di righe blu, rosse gialle e
bianche magari per spedire una sola email. 
Se si ha la possibilita' di puntare subito al server giusto, perche' non
farlo? 
Sandro

farlo?
Certo, non c'è nulla di male. :)
Preciserei, però, che non necessariamente, fra i sever SMTP che usi, 
ce n'è solo uno giusto, in un dato momento: possono esserci dei 
server free, può esserci il server del dominio del destinatario di 
una mail... insomma, nell'ipotesi che il server SMTP del tuo internet 
provider sia down (cosa che non capita poi così di rado), se lasci 
fare ad Hamster c'è la possibilità che tu spedisca comunque 
alcuni/tutti i messaggi.
Inoltre, ma è una mia filosofia, se posso lasciar fare agli altri 
qualcosa, e dimenticarmene... ;)))


qualcosa, e dimenticarmene... ;)))
Sfaticato!! :)) Se qualcosa si puo' migliorare?
E va be', un po' di ragione la hai, non appena ho un po' di tempo 
rimetto le dita sullo script per migliorarlo.
In effetti provare con un solo server e' un po' limitato.
Ciao
Sandro

Sandro ha scritto il lun 22 gen 2001 14:24:44
Ho modificato lo script anche se dopo la pratica alternativa di Lem ;)
rimane poco da migliorare, ma ho voluto finire quello che e' per me un 
esercizio.
Il file smtp.txt rimane sempre nella forma:
nome connessione::nomeserver
esempio:
libero::
mail.vene.dave.it
libero::
mail.libero.it
worldonline::
smpt.worldonline.it
interfree::
mail.interfree.it
tin::
mail.tin.it
tin::
altroserver.it
ALWAYS::
mail.vene.dave.it
ALWAYS::
altrosmtp.it
*::*
Il nome della connessione si puo' ripetere piu' volte, di modo che 
possano essere interpellati piu server.
Se e' presente la voce ALWAYS (in maiuscolo), i relativi server vengono 
interpellati sempre, qualsiasi sia la connessione di accesso remoto. 
Se e' presente la riga *::* (sconsigliata) vengono interpellati tutti i 
server registrati in hamster, (file nativo srvsmtp.hst) naturalmente 
solo quelli che ancora non sono stati collegati
Ogni volta che c'e' stato il collegamento con un server, si continuera' col 
successivo solo se c'e' ancora posta da spedire.
Ogni server viene connesso solo una volta, anche se il suo nome compare in 
diverse sezioni.
Se per esempio sono collegato con libero ed il nome della connessione di 
accesso remoto e' "libero", ed il mio file srvsmtp.hst e' il seguente:
mail.ciaoweb.net
,smtp
mail.interfree.it
,smtp
mail.libero.it
,smtp
mail.vene.dave.it
,smtp
smtp.worldonline.it
,smtp
altroserver.it
altrosmtp.it
verranno contattati nell'ordine:
mail.vene.dave.it
mail.libero.it
 
altrosmtp.it
mail.ciaoweb.net
mail.interfree.it
smtp.worldonline.it
altroserver.it
ovvero tutti, pero' in un certo ordine.
FILE InvioPosta.hsc
--------inizio script (da non inserire nel file) -------------
#!hs2
var($coll,$collattivo,$linea,$listasrv,$i) 
var($voce,$ee,$listasrv1 ,$nrfiles, $msg, $nrf) 
hamwaitidle
$nrfiles=EsistePosta
if ($nrfiles=0)
   warning ("Non c'e' posta da spedire")
   quit
else
   print("Trovato/i " +  $nrfiles + " messaggio/i da inviare")
endif
if (!fileExists("smtp.txt"))
   warning ("File smtp.txt mancante")
   quit
endif
if (RasIsConnected)
   $collattivo=RasGetConnection
   print ("Collegamento RAS attivo: " + $collattivo)
else
   warning ("Invio posta non effettuato_
per mancanza di un collegamento")
   quit
endif
$listasrv = listalloc()
$listasrv1 = listalloc()
listload($listasrv,"smtp.txt")
sottolista($listasrv,$collattivo,"::")
listload($listasrv1,"smtp.txt")
if (sottolista($listasrv1,"ALWAYS" ,"::")>0)
   listsomma($listasrv,$listasrv1)
endif
listload($listasrv1,"smtp.txt")
if (sottolista($listasrv1,"*" ,"::")>0)
   listload($listasrv1,"srvsmtp.hst")
   for ($i,0,listcount($listasrv1)-1)
      $linea= listget($listasrv1,$i)
      RE_Split ($linea, ",", $voce,$ee)
      ListSet ($listasrv1, $i ,$voce)
   endfor
   if (listcount($listasrv1)>0 ) 
      listsomma($listasrv,$listasrv1)
   endif
endif
if (listcount ($listasrv)>0)
  $nrf=invia($listasrv)
endif
$msg= "Inviato/i " + ($nrfiles - $nrf) + _
" su " + $nrfiles + " file/s"
if ($nrf) 
  warning ($msg)
else
  print ($msg)
endif
listfree($listasrv)
listfree($listasrv1)
quit
#######################################################################
#Questa routine ritorna il numero di email in coda
#######################################################################
sub EsistePosta ()
   var($listaf,$nrfiles)
   $nrfiles=0
   $listaf= listalloc()
   ListFiles ($listaf, HamPath + "Mails\Mail.Out\*.msg")        
   $nrfiles=(listcount($listaf))   
   listfree($listaf)
   return ($nrfiles)
endsub
# FINE SUB ############################################################
#######################################################################
#Questa routine accetta una lista di server smtp e tenta  l'invio 
#delle email in coda.
#La routine ritorna il numero di email ancora in coda
#######################################################################
sub invia($srvlist)
var($nrf,$smptsrv,$i)
for ($i,0,listcount($srvlist)-1)
        $smptsrv=listget($srvlist,$i)
        HamSendMail($smptsrv)
        hamwaitidle
        $nrf=EsistePosta
        if ($nrf=0) 
                break
        endif
endfor
endif
return ($nrf)
endsub
# FINE SUB ############################################################
#######################################################################
#Questa routine accetta una lista dove ogni riga e' nella forma 
chiave-separatore-voce 
#esempio: libero::
mail.libero.it
 ,e modifica la stessa lista in modo 
#da cancellare tutte le voci che non corrispondono alla chiave passata
#come parametro
#La routine ritorna il numero di righe della lista rimanente
#######################################################################
sub sottolista(*$lista,$chiave,$regexp)
var($id ,$voce,$linea,$i)
for ($i,0,listcount($lista)-1)
        $linea= listget($lista,$i)
        RE_Split ($linea, $regexp, $id, $voce)
        if ($id=$chiave)
                ListSet ($lista, $i ,$voce)
        else
                ListDelete ($lista, $i)
                $i=$i-1
        endif
endfor
return (listcount($lista))
endsub
# FINE SUB ############################################################
#######################################################################
#Questa routine accetta due liste, lista1 e lista2 e sostituisce a
#lista1=lista1+lista2 ovvero aggiunge a lista1 tutti i valori
#contenuti anche nella lista2 ma non in lista1 in modo che non ci siano 
#valori doppi
#La routine ritorna il numero di righe in lista1
#######################################################################
sub listsomma(*$lista1, $lista2)
var($i,$j,$linea1,$flag,$linea2)
for ($i,0,listcount($lista2)-1)
        $linea2=listget($lista2,$i)
        $flag=0
        for ($j,0,listcount($lista1)-1)
                $linea1=listget($lista1,$j)
                if ($linea1=$linea2)
                        $flag=1
                        break
                endif
        endfor
        if ($flag=0)
              ListAdd ($lista1, $linea2)
        endif
   endfor
return (listcount ($lista1))
endsub
# FINE SUB ############################################################