logo studioingtuberga - area Dev
Hamster

Hamster è un programma, per sistemi operativi Windows, in grado si svolgere egregiamente le funzioni di mail e news server.
Se siete interessati a questo programma, ma non avete mai visitato i seguenti siti, fatelo e ripassate di qui più tardi:

In questa pagina riporto la mia esperienza con questo programma, corredata di alcuni script da me realizzati con l'aiuto dell'help e della comunità italiana di Hamster (Il newsgroup su Google)
A beh...., gli script sono un modo per far eseguire ad hamster delle operazioni. Molti usano Hamster senza averne bisogno, queste persone, al momento, troveranno poco giovamento dalle mie pagine.

Per la gestione degli script in Hamster si può utilizzare il menù script (che nome fantasioso).
Come prime voci del menù vi sono gli script già disponibili per essere eseguiti; inoltre, se sono presenti delle sottodirectory, queste compaiono come ulteriori voci che aprono dei sottomenù con gli script che contengono.
La voce successiva è Gestione script e moduli..., da cui si apre una finestra che principalmente le seguenti funzionalità:

A dire il vero l'editor interno soffre di alcune limitazioni (es. non supporta il TAB). Premendo il tasto modifica si può quindi modificare lo script con l'editor impostato da Windows. So che esistono alcuni editor in grado di riconoscere la sintassi degli script di Hamster (ma non so dirvi quali sono :-)); io persolmente uso Scite, non riconosce la sintassi, ma è un ottimo editor open-source.

Un primo script per la gestione di tutte le operazioni potrebbe essere:

#!hs2
#!load hamster.hsm
 
AtAdd(riceviposta,"00:00","23.59","1111111",5,true)
AtAdd(spedisciposta,"00:00","23.59","1111111",1,true)
AtAdd(ricevinews,"00:00","23.59","1111111",30,true)
AtAdd(spediscinews,"00:00","23.59","1111111",5,true)
AtExecute
quit

Queste istruzioni non fanno altro che dire ad Hamster di attivare determinate funzioni ogni tot (il 5° parametro della funzione) minuti.
Esaminiamo ora le funzioni; inizialmente in versione molto limitata, poi aggiungerò altre funzioni. Gli script non sono astratti nelle variabili, quindi dovrete di volta in volta sostituire i vostri dati (nomi di server, account, ..) ai miei.

La funzione riceviposta permette di scaricare la posta ed è così composta:

sub riceviposta
 if (RasIsConnected)
  # scaricamento
  HamFetchMail ("popmail.inwind.it", "pop3", "$1", "", "luigi", "hot", "0")
  HamFetchMail ("pop3.infinito.it", "pop3", "$2", "", "luigi", "hot", "0")
 endif
endsub

E' molto semplice e per la sintassi di HamFetchMail vi rimando alla guida. Faccio solo notare che è meglio non utilizzare la possibilità di impostare username e password in chiaro, utilizzando invece dal menù Configura/account e password.. la tendina password aggintive per memorizzarle con un minimo di cifratura.

La funzione spedisciposta permette di inviare la posta in attesa:

sub spedisci
 If ((HamGetStatus( 3,7 ) > 0) && RasIsConnected) # nota1
  HamSendMail ("mail.inwind.it")
 endif
endsub

Anch'esso è molto semplice e l'istruzione nota1 fa in modo di eseguire l'invio solo se sono presenti mail in attesa.
Più sotto mostrerò come fare a postare sul server del provider a cui sono connesso o controllare che gli allegati delle mail in uscita non abbiano estensioni pericolose.

La funzione ricevinews scarica gli articoli dei newsgroup:

sub ricevinews
 if (RasIsConnected)
  HamNewsJobsClear
  HamNewsJobsAdd ("news.CIS.DFN.DE",4,"it.comp.java")
  HamNewsJobsAdd ("powernews.inwind.it",4,"it.comp.java")
  HamNewsJobsAdd ("newsreader.mailgate.org",4,"it.comp.java")
  HamNewsJobsStart
 endif
endsub

Come per le altre funzioni anche questa al momento è in versione semplificata. Risalta comunque una delle caratteristiche di Hamster: scaricare contemporaneamente gli articoli da più server!

Eccoci all'ultima funzione, spediscinews:

sub spediscinews
 If ((HamGetStatus( 3,5 ) > 0) && RasIsConnected) #nota1
  HamNewsJobsClear
  HamNewsJobsPostDef ("powernews.inwind.it")
  HamNewsJobsStart
 endif
endsub

Anche in questo caso l'istruzione nota1 permette di procedere con l'invio solo se vi sono news in uscita.
Più sotto mostrerò come fare a postare sul server del provider a cui sono connesso e postare su un server in cui il newsgroup è sottoscritto.

 
Veniamo alle estensioni di spedisciposta

Premessa; sono valide queste due affermazioni:

Se vi ritrovate in queste due affermazioni potreste essere interessati a questa parte di script.
Come avete notato l'istruzione di invio della posta utilizza sempre lo stesso server di uscita. Se però siete come me, che usa molti indirizzi e-mail e non si collegate in dialup sempre con lo stesso provider, l'invio non funziona a causa della prima affermazione.
Questa parte di script sfrutta la seconda affermazione per risolvere il problema, limitandosi a ricercare il server del provider in uso a partire dal nome della connessione. Già, il nome della connessione deve essere nella forma "stringanota"+" "+"qualsiasicosa", per cui estraggo "stringanota" e so qual'è il nome del suo server. Quindi alla prima parte di codice aggiungo la chiamata alla funzione che imposta il nome del server più la dichiarazione di alcune variabili:

var ($controlla,$servermail)
$controlla=1
AtAdd(settaprovider,"00:00","23.59","1111111",1,true)

Ed ecco la funzione settaprovider, limitata a pochi provider per motivi di spazio:

var ($conn,$pos)
if ($controlla=1 && RasIsConnected)
 # la connessione è attiva ma servermail è da impostare!
 $conn = (RasGetConnection) # estraggo il nome della connessione
 $pos = Pos(" ",$conn)
 if ($pos <> 0)
  $conn = Copy($conn,0,$pos-1) # se presenti altre info estraggo solo il provider
 endif
 if ($conn = "Wind")
  $servermail = "mail.inwind.it"
 else
  if ($conn = "Infinito")
   $servermail = "mail.infinito.it"
  else
   if ($conn = "Tiscali")
    $servermail = "smtp.tiscalinet.it"
   endif
  endif
 endif
 $controlla = 0
 return
endif
if ($controlla=0 && RasIsConnected) # connessione attiva con servermail impostato
 return
endif
if ($controlla=0 && !RasIsConnected) # connessione non attiva -> mi pongo in attesa
 $controlla = 1
 return
endif

Quindi $controlla è il direttore d'orchestra, che dice se devo aggiornare il nome del server perchè ho una nuova connessione; quindi dal nome della connessione estraggo una stringa che so associata ad un certo provider e voila.
Ora posso modificare spedisciposta in modo che posti sul server trovato:

HamSendMail ($servermail)

Bene, vediamo ora una mini soluzione al problema "regalo un virus ad un mio amico".
Questa funzione (sarà uno script) l'ho pensata per un mio amico (cosa non si fa per un amico :-)), da cui continuavo a ricevere quei virus che leggono la rubrica e si inoltrano da soli.
Il suo scopo è segnalare se in uscita vi è una mail con allegato un file con estensioni pericolose, riportando destinatario e soggetto, lasciando il compito di scegliere se inviarla o meno.
Se invece voleste utilizzare questo script per controllare la posta in entrata, prima di provare ad adattarlo leggete questo messaggio e la discussione che ne è seguita su hamster.it.misc.
Come premesso, questa parte è implementata come script e non come funzione, per cui bisogna modificare spedisciposta in modo che avvi lo script:

...
runscript ("controlla_allegati", "", 1)
HamSendMail ($servermail)
...

Lo script controlla allegati, per motivi di spazio si trova qui
Sono usate delle funzioni del modulo hmessage.hsm, a cui sono anche state adattate delle funzioni che trovate qui

Aggiungo qualche commento allo script.
A secondo del programma di mail che usate la struttura della riga da controllare potrebbe variare; io uso OE.
Lo script ha un senso solo se è presente qualcuno sul pc dove Hamster è installato, e questo qualcuno ha modo di sapere se la mail è lecita.
Le mail sospette vengono salvate in una sottodirectory di hamster di nome virus, che deve essere precedentemente creata.
Nello spostare le mail le rinomino come sospettovirus_n con n un numero progressivo che conservo nel file di supporto HScripts.ini, a cui va quindi aggiunta la seguente sezione.

[noninviate]
nmail=0

 
Veniamo alle estensioni di spediscinews

Premessa; sono valide queste quattro affermazioni:

Se vi ritrovate in queste quattro affermazioni potreste essere interessati a questa parte di script. Se non vi ritrovate nella terza forse fa al caso vostro la prossima modifica. Se non vi ritrovate nella seconda queste modifiche non vi servono, impostate il server pubblico come server di post è inviate tranquillamente.
Come avete notato l'istruzione di invio delle news utilizza sempre lo stesso server di uscita. Se però siete come me, non si collegate in dialup sempre con lo stesso provider, l'invio non funziona a causa della prima affermazione.
Se siete degli attenti lettori noterete che stò usando le frasi che ho usato per l'estensione settaprovider di spedisciposta. La soluzione si integra infatti con quella modifica con poche istruzioni in più.
Aggingiamo una nuova variabile $servernews (ricordarsi di dichiararla, la dov'è dichiarata $serverposta), che conterrà il nome del server e nella funzione settaprovider, ad ogni provider imposto la nuova variabile, come da esempio:

...
if ($conn = "Wind")
 $servermail = "mail.inwind.it"
 $servernews = "powernews.inwind.it"
else
...

Ora è sufficiente modificare spediscinews in modo che usi $servernews

...
  HamNewsJobsPostDef ($servernews)
...

Passiamo ora alla seconda modifica. Se non lo avete fatto vi consiglio di dare un'occhiata alla modifica precedente, anche perchè questa ne è un'estensione.
Voglio arrivare ad una soluzione di questo tipo: data una news da inviare al gruppo A, posto sul server del provider in uso se su questo server il gruppo è sottoscritto, altrimenti posto sul primo server pubblico in cui il gruppo A è sottoscritto.
Per fare questo uso uno script che attivo in spediscinews che viene cosi riscritta:

sub spediscinews
 If ((HamGetStatus( 3,5 ) > 0) && RasIsConnected) #news in uscita
  runscript ("post_news", $servernews, true)
 endif
endsub

Come vedete dalla chiamata, lo script richiede la variabile $serverposta che si ricava con la modifica precedente. Lo script è lunghetto, per cui si trova qui

Veniamo ai commenti extra.
Lo script necessita dell'elenco dei server pubblici. Poichè il file server.hst contiene anche i server dei provider, questo elenco lo scrivo a mano nel solito file di supporto HScripts.ini con la seguente sezione (i nomi dei server sono separati da ','):

[newsserverpubblici]
nomeserver=news.gmane.org,news.CIS.DFN.DE,newsreader.mailgate.org

Lo script estrae quindi l'elenco di cui sopra e pone in cima il server del provider in uso, contenuto in $serverconn, che ha ricevuto come parametro.
Poichè posso avere news da spedire su server differenti, momentaneamente le sposto tutte in una directory temporanea $TempDir, directory che va precedentemente creata.
Quindi per ogni elemento della lista dei server, cominciando dal server del provider in uso eseguo:
- leggo da ogni singola news il gruppo su cui voglio inviarla, e sottolineo il gruppo (se vi piace il crosspost, sicuramente non avrete ritegno a sovraccaricare i server pubblici e quindi non vedo cosa vi possa interessare questo script).
- dal file pulls.hst cerco se nel server in esame ho sottoscritto questo gruppo. Se lo trovo sposto la news nella cartella nelle news in uscita (News.out). Controllate tutte le news invio quelle poste in News.out usando il server in test.
Terminato l'elenco dei server, se ho news non spedite, perchè il loro gruppo è sottoscritto solo su un server di un provider a cui non sono collegato, avviso che l'invio sarà ritentato successivamente.

Bene, se siete arrivati fino a qui vi meritate una pausa, e me la faccio anche io :-)

(..... continua, prossimamente sui vostri schermi ...ops monitor..... )