# Bogofilter FAQ

Versioni ufficiali: in Inglese o Francese o Italiano o Bulgaro
Maintainer: David Relson <relson@osagesoftware.com>
Traduzione italiana di Marco Bozzolan <bozzolan@gmail.com>

Con questo documento si intende rispondere alle domande poste frequentemente riguardanti bogofilter.

### Convenzioni tipografiche

- Se mostriamo un comando d'esempio che inizia con un simbolo di dollaro ($), questo significa che questi comandi dovrebbero essere eseguiti come utente senza provilegi, NON come utente root.
- Se mostriamo comandi d'esempio che iniziano con un cancelletto (#), ciò significa che questi comandi devono essere eseguiti come utente root.

### Domande poste frequentemente e loro risposte

- Informazioni generali
  - Che cos'è bogofilter?
  - Bogo che?
  - Come funziona bogofilter?
  - Liste di discussione su bogofilter
- Domande operative
  - Come avvio l'apprendimento di bogofilter?
  - Come posso mantenere alta l'accuratezza nell'assegnazione del punteggio?
  - Quali formati di posta sono supportati da bogofilter?
  - Cosa significa l'output verboso di bogofilter?
  - Che cos'è la modalità insicura?
  - Cosa sono l'"apprendimento dagli errori" e l'"apprendimento per esaurimento"
  - Cosa fa l'opzione '-u' (autoaggiornamento)?
  - Come posso utilizzare SpamAssassin per istruire bogofilter?
  - Cosa posso fare contro lo spam asiatico?
- Domande sul database
  - Come posso compattare il database?
  - Come si fa una ricerca manuale sul database?
  - Posso usare liste di termini multiple?
  - Posso dire a bogofilter di ignorare certi termini?
  - Come faccio ad aggiornare da un database di termini separati al formato con liste di termini combinate?
  - Come converto la mia lista di termini in/da unicode?
  - Come faccio a capire se le mie liste di termini sono corrotte?
- Domande sul database Berkeley
  - Come passo dalla modalità non-transaction a quella transaction?
  - Come passo dalla modalità transaction a quella non-transaction?
  - Perché bogofilter muore dopo aver stampato
    "Lock table is out of available locks" oppure
    "Lock table is out of available object entries"?
  - Perché ottengo messaggi DB_PAGE_NOTFOUND?
  - Perché ottengo "Berkeley DB library configured to support only DB_PRIVATE environments" o "Berkeley DB library configured to support only private environments"?
- Problemi tecnici
  - Bogofilter può essere usato in un ambiente multiutente?
  - Posso condividere le liste di termini attraverso NFS?
  - Perché bogofilter restituisce codici come 0 e 256 quando viene lanciato dall'interno di un programma?
  - Ora che ho aggiornato perché si sono corrotti i miei scripts?
  - Ora che ho aggiornato perché bogofilter sta lavorando peggio?
  - Come posso eliminare tutti i token dello spam (o quelli non-spam)?
- Problemi di compilazione e portabilità
  - Come faccio a far funzionare bogofilter su Solaris, BSD, ecc?
  - Posso usare il comando make sul mio sistema operativo?
  - Come compilo bogofilter come utente non-root per installarlo in una directory non standard?
  - Come compilo bogofilter con le patch?
  - Come rendo gli eseguibili più piccoli?
  - datastore_db.c non compila!
- Usare bogofilter con differenti programmi di posta
  - Con quali programmi di posta funziona bogofilter?
  - Come uso bogofilter con mutt?
  - Come uso bogofilter con Sylpheed Claws?
  - Come uso bogofilter con VM (uno strumento di Emacs per la posta)?
  - Come uso bogofilter con MH-E (l'interfaccia Emacs al sistema di posta MH)?

## Che cos'è bogofilter?

Bogofilter è un filtro bayesiano veloce contro lo spam implementato secondo le linee indicate da Paul Graham nel suo articolo "A plan for spam" ("Un piano per lo spam"). Bogofilter usa l'algoritmo per la media geometrica di Gary Robinson insieme alla modifica del metodo di Fisher per classificare i messaggi come spam o non-spam.

La pagina dedicata a bogofilter presso SourceForge è il punto di riferimento per le risorse relative a bogofilter.

Bogofilter è stato iniziato da Eric S. Raymond il 19 agosto 2002. Ha guadagnato popolarità nel settembre 2002, e un gruppo di altri autori hanno iniziato a contribuire al progetto.

Il file NEWS descrive la cronologia delle versioni di bogofilter.

## Bogo-che?

Bogofilter è una sorta di bogometro (bogometer) o filtro bogon (bogon filter), ovvero tenta di identificare i messaggi impropri (bogus) misurandone la bogosità (bogosity).

## Come funziona bogofilter?

Vedi la sezione Theory of operation (teoria dell'operazione) per un'introduzione. La fonte principale per la comprensione è questo articolo di Gary Robinson apparso sul Linux Journal: "A Statistical Approach to the Spam Problem" (Un approccio statistico al problema dello spam).

Dopo aver letto tutto ciò potresti avere delle domande. La prima potrebbe essere "Bogofilter è davvero un filtro baesiano?". Bogofilter è basato sul teorema di Bayes e lo usa per i calcoli iniziali e successivamente per altri metodi statistici. Senza dubbio è un filtro statistico per lo spam baesiano sotto molti aspetti.

Altre domande che potresti avere potrebbero riguardare gli assunti di base della teoria di Bayes. Due brevi risposte sono: "No, non sono soddisfatte" e "A noi non interessano, fintanto che funziona". Una risposta più articolata spiegherà che l'ipotesi di partenza che "una e-mail è una raccolta casuale di parole, ciascuna indipendente dalle altre" è violata. Ci sono diversi casi in cui la pratica non segue la teoria. Alcuni sono sempre presenti, altri dipenderanno dal modo in cui usi bogofilter:

- le parole in una e-mail non sono mai indipendenti. In tutte le lingue è vero il contrario.
- le parole usate non sono casuali, benché alcuni spammer inseriscano termini "a casaccio"
- l'apprendimento completo utilizzando un campione casuale segue i principi di Bayes. Una scelta dei messaggi da usare per l'apprendimento violerebbe l'ipotesi che tali messaggi siano un campione casuale dei messaggi ricevuti. Questo principio viene anche violato dalla funzione per l'autoaggiornamento di bogofilter (con il parametro thresh_update) training on error, o qualunque altro approccio simile a questo.
- lo stesso accade se usi per l'apprendimento lo stesso messaggio più di una volta.
- altri problemi sorgono se modifichi il tuo database rimuovendo tokens (per esempio usando bogoutil con -a o -c).
- senza dubbio ce ne sono altri.

Come spiegato dalla man page, bogofilter cerca di capire quanto malamente fallisce l'ipotesi nulla. Alcune persone sostengono che "tali scostamenti dalla realtà di solito sono a nostro favore" (dall'articolo di Gary). Altri sostengono che, anche in tali casi, non dovremmo scostarci troppo. Nessuno davvero sa. Tieni solo a mente che potresti avere dei problemi se spingi troppo. La chiave nell'approccio di Bogofilter è: quello che importa maggiormente è semplicemente quello che funziona nel mondo reale.

Ora che sei stato avvisato, divertiti e usa Bogofilter come meglio ti sembra.

## Liste di discussione

Ci sono attualmente quattro liste di discussione per bogofilter:

1. bogofilter-announce@bogofilter.org: [iscriviti][archivi: mailman, gmane]. Una lista di soli annunci dove vengono presentate le nuove versioni.
2. bogofilter@bogofilter.org: [iscriviti][archivi: mailman, gmane]. Una lista di discussione dove parlare di bogofilter.
3. bogofilter-dev@bogofilter.org: [iscriviti][archivi: mailman, gmane]. Una lista per condividere patch e discussioni tecniche e sullo sviluppo.
4. bogofilter-cvs@lists.sourceforge.net: [iscriviti][archivio]. Lista per annunciare le modifiche al codice nell'archivio CVS.

La lista bogofilter-announce è moderata e viene utilizzata solo per annunci importanti (come quelli relativi a nuove versioni). È una lista poco trafficata. Se sei iscritto alla lista degli utilizzatori o a quella degli sviluppatori, non hai bisogno di iscriverti a quella degli annunci. I messaggi inviati alla lista degli annunci vengono anche inoltrati alle altre liste.

## Come avvio l'apprendimento di bogofilter?

Per classificare i messaggi come ham (non spam) o come spam, bogofilter ha bisogno di imparare dalla tua posta. Per iniziare è meglio avere collezioni (il più estese possibili) di messsaggi che sai essere ham o spam. (Errori in questa fase causeranno dei problemi in seguito, dunque fai attenzione `;-)`. Attenzione: usa soltanto la tua posta; usare altre collezioni (come una collezione di spam trovata sul web) potrebbe portare bogofilter a conclusioni errate — dopo tutto tu vuoi che capisca la tua posta.

Una volta che hai le collezioni di spam e ham, puoi scegliere tra quattro opzioni. In tutti i casi funziona meglio se la tua base d'apprendimento (le collezioni di cui sopra) sono più estese, piuttosto che più ristrette. Più la tua base d'apprendimento è ristretta, più alto sarà il numero di errori che bogofilter farà in produzione. Assumiamo che la tua base sia composta da due files: ham.mbox e spam.mbox.

- Metodo 1. Apprendimento completo. Passa a bogofilter tutti i tuoi messaggi. Nel nostro esempio:

          bogofilter -s < spam.mbox
          bogofilter -n < ham.mbox

Nota: la directory contrib di Bogofilter contiene due script che utilizzano la tecnica train-on-error. Questa tecnica assegna un punteggio a ogni messaggio e aggiunge al database solo quei messaggi che erano stati valutati in modo scorretto (messaggi valutati come incerti, ham valutato come spam, o spam valutato come ham). L'obiettivo è costruire un database di quelle parole necessarie per classificare correttamente i messaggi. Il database risultante è più piccolo di quello costruito utilizzando l'apprendimento completo.

- Metodo 2. Usa lo script bogomintrain.pl (nella directory contrib). Esso controlla i messaggi nello stesso ordine dei tuoi file mailbox. Puoi usare l'opzione `-f` che ripeterà questa operazione finché tutti i messaggi nella tua collezione per l'apprendimento saranno classificati correttamente (puoi anche correggere il livello di certezza). Poiché lo script si assicura che il database comprenda la tua collezione iniziale "esattamente" (con la precisione da te richiesta), funziona molto bene. Puoi usare `-o` per creare un margine di sicurezza attorno al tuo spam_cutoff. Assumendo spam_cutoff=0.6 potresti voler assegnare a tutto lo ham nella tua collezione sotto 0.3 e tutto lo spam sopra 0.9. Il nostro esempio è:

          bogominitrain.pl -fnv ~/.bogofilter ham.mbox spam.mbox '-o 0.9,0.3'

- Metodo 3. Usa lo script randomtrain (nella directory contrib). Lo script genera una lista di tutti i messaggi nelle mailbox, riordina la lista in modo casuale, e poi valuta ogni messaggio, con l'apprendimento se richiesto. Nel nostro esempio:

          randomtrain -s spam.mbox -n ham.mbox

  Come con il metodo 4, funziona meglio se inizi con l'apprendimento completo usando alcune migliaia di messaggi. Questo fornirà un database che sarà pié comprensivo e significativamente pié esteso.

- Metodo 4. Se hai abbastanza messaggi spam e non spam nella tua collezione iniziale, separa dal resto circa 10 000 messaggi di spam e 10 000 non spam in file mbox separati, ed esegui l'apprendimento come nel metodo 1. Poi usa bogofilter per classificare i rimanenti spam e non spam. Prendi ogni messaggio che viene classificato scorrettamente o come incerto, e fai l'apprendimento con quelli. Qui ci sono due brevi script che puoi utilizzare per classificare i messaggi nel train-on-error:

          #! /bin/sh
          #  class3 -- classify one message as bad, good or unsure
          cat >msg.$$
          bogofilter $* <msg.$$
          res=$?
          if [ $res = 0 ]; then
      	cat msg.$$ >>corpus.bad
          elif [ $res = 1 ]; then
      	cat msg.$$ >>corpus.good
          elif [ $res = 2 ]; then
      	cat msg.$$ >>corpus.unsure
          fi
          rm msg.$$

          #! /bin/sh
          # classify -- put all messages in mbox through class3
          src=$1;
          shift
          formail -s class3 $* <$src

  Nel nostro esempio (dopo l'apprendimento completo iniziale):

          classify spam.mbox [bogofilter options]
          bogofilter -s < corpus.good
          rm -f corpus.*
          classify ham.mbox [bogofilter options]
          bogofilter -n < corpus.bad
          rm -f corpus.*

### Confronto tra i metodi

È importante capire le conseguenze dei metodi appena descritti. Fare l'apprendimento completo come nei metodi 1 e 4 produce un database più esteso di quanto facciano i metodi 2 e 3. Se hai bisogno che la dimensione del database rimanga piccola (per esempio a causa di limitazioni di quota) usa i metodi 2 o 3.

L'apprendimento completo con il metodo 1 è il più rapido. L'apprendimento sugli errori (nei metodi 2, 3 e 4) è efficente, ma l'apprendimento iniziale richiede più tempo.

## Come posso mantenere alta l'accuratezza nell'assegnazione del punteggio?

Bogofilter farà degli errori di tanto in tanto. Dunque l'apprendimento costante è importante. Ci sono due metodi principali per fare ciò. Primo, puoi usare ogni messaggio in arrivo come base d'apprendimento (usando l'opzione `-u`). Secondo, puoi fargli imparare dagli errori.

Poiché potresti voler ricostruire il tuo database ad un certo punto, per esempio quando una nuova funzionalità viene implementata in bogofilter, può essere molto utile aggiornalre la tua collezione d'apprendimento continuamente.

Bogofilter fa sempre del suo meglio con le informazioni che ha in suo possesso. Comunque, farà degli errori, ad esempio classificare ham come spam (falsi positivi) o spam come ham (falsi negativi). Per ridurre la possibilità che l'errore si ripeta, è necessario far imparare a bogofilter dal messaggio classificato erroneamente. Se un messaggio viene classificato scorrettamente come spam, usa l'opzione `-n` per notificarlo come ham. Usa `-s` per riclassificare un messaggio di spam.

Bogofilter ha un'opzione `-u` che aggiorna automaticamente la lista delle parole dopo aver valutato ogni messaggio. Poiché bogofilter talvolta sbaglia nella classificazione di un messaggio, un monitoraggio è necessario per correggere eventuali errori. Le correzioni possono essere fatte usando `-Sn` per cambiare la classificazione da spam a non spam e `-Ns` per cambiarla da non spam a spam.

La correzione della classificazione di un messaggio potrebbe influenzare la classificazione di altri messaggi. Più piccolo è il database, più alta è la possibilità che un errore nell'apprendimento causi una classificazione errata.

L'utilizzo di un metodo come il 2 o il 3 (sopra) può compensare questo effetto. Ripeti l'apprendimento con la collezione iniziale completa (includendo tutti i nuovi messaggi aggiunti dal precedente apprendimento). Questo aggiungerà messaggi al database, il quale mostrerà effetti opposti ad entrambi i lati fino a che avrai un nuovo equilibrio.

Una strategia alternativa, basata sul metodo 4 nella sezione precedente, è il seguente: periodicamente prendi blocchi di messaggi e usa gli script indicati nel metodo 4 per classificarli. Poi controlla manualmente quelli corretti, quelli scorretti e gli incerti, correggi gli errori e dividi gli incerti tra spam e non spam. Quando hai accumulato circa 10 000 messaggi spam e 10 000 non spam, esegui l'apprendimento con quelli corretti, non corretti e con quelli scorretti separati e gli incerti; poi, esegui l'apprendimento solo con quelli separati e gli incerti, scartando i messaggi che bogofilter già classifica correttamente.

## Quali formati di posta sono supportati da bogofilter?

Bogofilter supporta il formato tradizionale delle mailbox Unix e i formati Maildir e MH. Nota però che bogofilter non supporta le sottocartelle, dovrai elencarle esplicitamente tra le cartelle MH o Maildir++ - basta menzionare il percorso completo fino alla sottocartella.

Per i formati non supportati, dovrai convertire la mailbox in un formato utilizzato anche da bogofilter. Mbox risulta spesso conveniente perché può essere passato direttamente a bogofilter.

Per convertirlo formato UW-IMAP/PINE in mbox:

        mailtool copy /percorso/completo/di/mail.mbox '#driver.unix//percorso/completo/di//mbox'

o:

        for MSG in /full/path/to/maildir/* ; do
    	    formail -I Status: < "$MSG" >> /full/path/to/mbox
        done

## Cosa significa l'output verboso di bogofilter?

Bogofilter può essere istruito per mostrare informazioni sulla valutazione di un messaggio lanciandolo con le opzioni "-v", "-vv", "-vvv" o "-R".

- Utilizzando "-v" bogofilter genera la riga d'intestazione "X-Bogosity:", come nell'esempio:

          X-Bogosity: Ham, tests=bogofilter, spamicity=0.500000

- Utilizzando "-vv" bogofilter genera un istogramma, per esempio:

          X-Bogosity: Ham, tests=bogofilter, spamicity=0.500000
            int  cnt    prob   spamicity  histogram
           0.00   29  0.000209  0.000052  #############################
           0.10    2  0.179065  0.003425  ##
           0.20    2  0.276880  0.008870  ##
           0.30   18  0.363295  0.069245  ##################
           0.40    0  0.000000  0.069245
           0.50    0  0.000000  0.069245
           0.60   37  0.667823  0.257307  #####################################
           0.70    5  0.767436  0.278892  #####
           0.80   13  0.836789  0.334980  #############
           0.90   32  0.984903  0.499835  ################################

  Ogni riga mostra un intervallo, il conteggio dei termini con i valori in quell'intervallo, la probabilità media che tali termini siano spam, il punteggio del messaggio (per quei termini e per tutti quelli con punteggio inferiore), e un grafico a barre corrispondente al conteggio dei termini.

  Nell'istogramma sopra riportato ci sono un sacco di termini con punteggio basso e un sacco di termini ad alto punteggio. Essi si bilanciano a vicenda per fornire un punteggio per il messaggio di 0.5000.

- Usando "-vvv" si ottiene una lista di tutti i termini nei messaggi con le informazioni relative a ciascuno, come nell'esempio:

          X-Bogosity: Ham, tests=bogofilter, spamicity=0.500000
      			      n    pgood     pbad      fw     U
          "which"              10  0.208333  0.000000  0.000041 +
          "own"                 7  0.145833  0.000000  0.000059 +
          "having"              6  0.125000  0.000000  0.000069 +
          ...
          "unsubscribe.asp"     2  0.000000  0.095238  0.999708 +
          "million"             4  0.000000  0.190476  0.999854 +
          "copy"                5  0.000000  0.238095  0.999883 +
          N_P_Q_S_s_x_md      138  0.00e+00  0.00e+00  5.00e-01
      			     1.00e-03  4.15e-01  0.100

  Le colonne stampate contengono le seguenti informazioni:
  "…"
    il blocco in questione
  n
    il numero di volte che il blocco è stato trovato nell'apprendimento
  pgood
    la porzione di messaggi buoni che contenevano questo blocco
  pbad
    la porzione di messaggi spam che contenevano questo blocco
  fw
    l'indice pesato di Robinson, che combina pgood e pbad per fornire un valore che sarà vicino a zero se un messaggio contenente questo blocco non sembra essere spam, mentre sarà vicino a uno se sembrerà essere spam
  U
    '+' se questo blocco contribuisce al punteggio finale del messaggio, '-' in caso contrario. Un blocco viene escluso quando il suo punteggio è più vicino a 0.5 di min_dev.

  Le linee finali mostrano:

  - I totali relativi alle colonne
  - I valori della s e della x di Robinson e di min_dev
- Usando "-R" si ottiene lo stesso risultato di "-vvv" sopra descritto più due colonne aggiuntive:
  invfwlog
    logaritmo di fw
  fwlog
    logaritmo di (1-fw)

  L'output di "-R" è formattato per l'utilizzo con il linguaggio R per il calcolo statistico. Maggiori informazioni sono disponibili presso Il progetto R per il calcolo statistico.

## Che cos'è la modalità insicura?

La configurazione predefinita di bogofilter classificherà un messaggio come spam o non spam. Per fare ciò viene utilizzato il parametro SPAM_CUTOFF. Messaggi con punteggio maggiori o uguali a SPAM_CUTOFF sono classificati come spam. Gli altri messaggi sono catalogati come ham.

Esiste anche un parametro HAM_CUTOFF. Quando questo viene utilizzato, i messaggi devono avere punteggi minori o uguali a HAM_CUTOFF per essere riconosciuti come ham. I messaggi con punteggi compresi tra HAM_CUTOFF e SPAM_CUTOFF sono classificati come incerti. Se guardi in bogofilter.cf, vedrai le seguenti linee:

        #### CUTOFF Values
        #
        #    both ham_cutoff and spam_cutoff are allowed.
        #    setting ham_cutoff to a non-zero value will
        #    enable tri-state results (Spam/Ham/Unsure).
        #
        #ham_cutoff  = 0.45
        #spam_cutoff = 0.99
        #
        #    for two-state classification:
        #
        ## ham_cutoff = 0.00
        ## spam_cutoff= 0.99

Per attivare la classificazione con Sì/No/Incerto rimuovi i caratteri # dalle ultime due righe.

Alternativamente, se preferisci utilizzare le etichette Sì/No/Incerto invece di Spam/Ham/Incerto, rimuovi i caratteri # dalle seguenti righe di bogofilter.cf:

        ## spamicity_tags = Yes, No, Unsure

Una volta fatto ciò, potresti voler impostare le regole del tuo programma di filtraggio della posta per includere qualcosa come:

        Se l'intestazione contiene "X-Bogosity: Spam", metti il messaggio nella cartella Spam
        Se l'intestazione contiene "X-Bogosity: Unsure", metti il messaggio nella cartella Incerti

In alternativa, bogofilter.cf contiene delle direttive per modificare la linea dell'oggetto, es:

        #### SPAM_SUBJECT_TAG
        #
        #    dicitura aggiunta alla linea "Oggetto:" per identificare spam o gli incerti
        #    l'impostazione predefinita non aggiunge nulla
        #
        ##spam_subject_tag=***SPAM***
        ##unsure_subject_tag=???UNSURE???

Con queste diciture nell'oggetto, le regole per il filtraggio diventerebbero:

        Se l'oggetto contiene "***SPAM***" metti il messaggio nella cartella Spam
        Se l'oggetto contiene "???UNSURE???" metti il messaggio nella cartella Incerti

## Cosa sono l'"apprendimento dagli errori" e l'"apprendimento per esaurimento"

L'"apprendimento dagli errori" comporta la scansione di un corpus di messaggi noti come spam e non spam; solo quelli che vengono classificati in modo errato, o come incerti, vengono registrati nel database d'apprendimento. È stato verificato che presentare solo messaggi inclini ad una classificazione scorretta sia un metodo efficiente di apprendimento; se alleni bogofilter con messaggi di difficile classificazione, esso apprende anche a riconoscere i messaggi palesemente di spam e non spam.

Questo metodo può essere rafforzato utilizzando un "margine di sicurezza". Aumentando il valore di soglia dello spam e diminuendo il valore di soglia dello ham, i messaggi che sono vicini ai valori di soglia saranno utilizzati per l'apprendimento. L'utilizzo del margine di sicurezza migliora i risultati quando si sta apprendendo dagli errori. In generale, margini di sicurezza più ampi aiutano di più (ma neanche impostarli troppo ampi è una scelta ottimale). Come regola empirica il valore di soglia più o meno 0.3 dà buoni risultati. Per la modalità a tre stati, potresti provare la metà dell'intervallo per i messaggi incerti più o meno 0.3.

Ripetere l'apprendimento dagli errori sullo stesso insieme di messaggi può migliorare la precisione. L'idea è che i messaggi che erano stati valutati correttamente nella prima occasione potrebbero non esserlo più dopo nuovo apprendimento, e in questo modo sarebbero corretti.

L'"apprendimento per esaurimento" consiste nel ripetere l'apprendimento dagli errori, con lo stesso insieme di messaggi, finché non viene commesso più alcun errore. Anche questo metodo può essere migliorato con i margini di sicurezza. Vedi la pagina Gary Robinson's Rants su questo argomento per maggiori dettagli.

Nota: `bogomintrain.pl` ha un'opzione `-f` per fare l'apprendimento per esaurimento. Usando `-fn` si evita di ripetere l'apprendimento per ogni messaggio.

## Cosa fa l'opzione '-u' (autoaggiornamento)?

L'opzione `-u` (autoaggiornamento) viene utilizzato per espandere automaticamente il dizionario. Quando viene utilizzata questa opzione e bogofilter classifica un messaggio come ham o spam, i termini che costituiscono il messaggio vengono aggiunti al dizionario con un indicatore di spam/ham (come appropriato).

Come esempio, supponiamo che arrivi un nuovo messaggio "Refinance now - best Mortgage rates". Esso conterrà alcune parole che bogofilter ha già incontrato e (probabilmente) altre nuove. Usando `-u` le nuove parole saranno aggiunte al dizionario in modo che bogofilter possa riconoscere il messaggio che segue.

Se/quando usi `-u`, devi stare all'erta per individuare gli errori di classificazione e segnalare a bogofilter ogni messaggio venga erroneamente classificato. Un messaggio non riconosciuto correttamente potrebbe far commettere altri errori a bogofilter in futuro. Si tratta dello stesso problema che si presenta quando tu (l'amministratore di sistema) registri scorrettamente un messaggio ham come spam (o viceversa).

## Come posso utilizzare SpamAssassin per istruire bogofilter?

Se hai un'installazione funzionante di SpamAssassin (o ne crei una), puoi utilizzare i suoi return codes per istruire bogofilter. Il modo più semplice è di creare uno script per il tuo MDA che esegue SpamAssassin, verifica il return code e lancia bogofilter per registrare il messaggio come spam (o non spam). Il file di regole per procmail che segue mostra un modo per fare ciò:

        BOGOFILTER     = "/usr/bin/bogofilter"
        BOGOFILTER_DIR = "training"
        SPAMASSASSIN  = "/usr/bin/spamassassin"

        :0 HBc
        * ? $SPAMASSASSIN -e
        #spam yields non-zero
        #non-spam yields zero
        | $BOGOFILTER -n -d $BOGOFILTER_DIR
        #else (E)
        :0Ec
        | $BOGOFILTER -s -d $BOGOFILTER_DIR

        :0fw
        | $BOGOFILTER -p -e

        :0:
        * ^X-Bogosity:.Spam
        spam

        :0:
        * ^X-Bogosity:.Ham
        non-spam

## Cosa posso fare contro lo spam asiatico?

Molte persone ricevono mail indesiderate che utilizzano i set di caratteri delle lingue asiatiche. Poiché non conoscono quelle lingue e non conoscono gente di laggiù, concludono si tratti di spam.

La buona notizia è che bogofilter individua quei messaggi con buon successo. Quella cattiva è che questo può essere costoso. Puoi scegliere tra due opzioni:

- Puoi semplicemente lasciare che bogofilter gestisca questi messaggi. Istruisci bogofilter utilizzando i messaggi in lingua asiatica identificati come spam. Bogofilter leggerà i messaggi nel miglior modo e aggiungerà i termini al dizionario dello spam. Il dizionario conterrà molti termini che non avranno senso per te (visto che il set di caratteri non può essere visualizzato), ma bogofilter può lavorare senza problemi con essi e identificare con successo lo spam asiatico.

- Un secondo metodo consiste nell'utilizzare l'opzione "replace_nonascii_characters" nel file di configurazione. Questo sostituirà i caratteri con bit alto, ovvero quelli compresi tra 0x80 e 0xFF, con punti interrogativi, '?'. Questo terrà il database molto più piccolo. Sfortunatamente questo metodo non è adatto ai messaggi scritti nelle lingue europee, che hanno molte vocali accentate e consonanti nell'intervallo con bit alto.

- Se sei sicuro che non riceverai nessun messaggio scritto in queste lingue, puoi escluderli fin dall'inizio. Questo manterrà il database di dimensioni contenute. Puoi farlo con uno script per MDA.

  Segue un file di regole per procmail che accantonerà i messaggi scritti con set di caratteri asiatici:

          ## Silently drop all Asian language mail
          UNREADABLE='[^?"]*big5|iso-2022-jp|ISO-2022-KR|euc-kr|gb2312|ks_c_5601-1987'
          :0:
          * 1^0 $ ^Subject:.*=\?($UNREADABLE)
          * 1^0 $ ^Content-Type:.*charset="?($UNREADABLE)
          spam-unreadable

          :0:
          * ^Content-Type:.*multipart
          * B ?? $ ^Content-Type:.*^?.*charset="?($UNREADABLE)
          spam-unreadable

  Con la regola appena descritta, bogofilter non vedrà mai il messaggio.

## Come posso compattare il database?

Puoi compattare periodicamente il database in modo che occupi sempre un minimo spazio su disco. Assumendo che il tuo dizionario si trovi nella directory ~/.bogofilter, con bogofilter 0.93.0 (o più recente) userai:

        bf_compact ~/.bogofilter wordlist.db

Con una versione precedente alla 0.93.0 usa invece:

        cd ~/.bogofilter
        bogoutil -d wordlist.db | bogoutil -l wordlist.db.new
        mv wordlist.db wordlist.db.prv
        mv wordlist.db.new wordlist.db

Lo script è necessario per duplicare il tuo ambiente di database (per poter supportare il processo delle transazioni BerkeleyDB). La tua directory originale verrà rinominata in ~/.bogofilter.old e ~/.bogofilter conterrà il nuovo ambiente database.

Poiché versioni precedenti di bogofilter non usano le transazioni Berkeley DB, il database è un file singolo (wordlist.db) e non è necessario usare lo script. I comandi mostrati sopra creano un nuovo database compatto e rinominano il file originale in wordlist.db.prv.

Nota: va bene anche usare lo script con vecchie versioni di bogofilter.

## Come si fa una ricerca manuale sul database?

Per trovare i valori spam e ham per un termine usa l'opzione `-w` di bogoutil. Per esempio, `bogoutil -w $BOGOFILTER_DIR/wordlist.db example.com` fornisce il numero di messaggi ham e spam contenenti "example.com".

Se vuoi anche il punteggio spam in aggiunta ai valori ham e spam per un termine usa l'opzione `-p` di bogoutil. Per esempio, `bogoutil -p $BOGOFILTER_DIR/wordlist.db example.com` fornisce il numero di messaggi ham e spam contenenti "example.com"

Per sapere quanti messaggi ci sono nel tuo dizionario interroga il termine speciale .MSG_COUNT, ad esempio con il comando `bogoutil -w $BOGOFILTER_DIR/wordlist.db .MSG_COUNT` per vedere i conteggi per i dizionari di ham e spam.

Per sapere quanti termini ci sono nei tuoi dizionari concatena l'output del comando dump di bogoutil con il comando `wc`: `bogoutil -d $BOGOFILTER_DIR/wordlist.db | wc -l` mostrerà il totale.

## Posso usare liste di termini multiple?

Sì. Bogofilter può essere lanciato con dizionari multipli. Per esempio, se hai dizionari di sistema e per singoli utenti, bogofilter può essere configurato in modo che controlli il dizionario dell'utente e, se non trova la parola, allora controlli il dizionario di sistema. Alternativamente, può essere configurato in modo da unire le informazioni dalle due liste.

Seguono le opzioni per il file di configurazione e alcuni esempi.

Un dizionario ha diversi attributi, solitamente tipo, nome, nome del file e priorità.

- Tipo: 'R' e 'I' (per "regolare" e "ignora"). I dizionari in uso sono di tipo 'R'. Il tipo 'I' significa "non assegnare punteggio al termine se trovato nella lista di quelli da ignorare"
- Nome: un breve simbolo identificativo usato nella stampa dei messaggi di errore. Esempi sono "globale", "utente" e "ignora", ma puoi usare qualunque identificativo tu voglia.
- Nome del file: il nome (percorso) del file. All'apertura del dizionario, se il nome è completamente descritto (con un '/' o '~' iniziale) viene usato quel nome. Altrimenti bogofilter premetterà la directory, seguendo il normale ordine di ricerca: $BOGOFILTER_DIR, $BOGODIR, $HOME.
- Priorità: un intero come 1, 2, 3, ... I dizionari sono consultati per ogni parola in ordine ascendente. Se il termine cercato viene trovato, vengono consultate le altre liste con uguale priorità (e i valori addizionati tra loro). Liste con priorità più alta non verranno consultate.

Esempio 1 - unisce liste di sistema e per singolo utente:

        wordlist R,user,~/wordlist.db,1
        wordlist R,system,/var/spool/bogofilter/wordlist.db,1

Esempio 2 - preferisce il dizionario utente a quello di sistema:

        wordlist R,user,~/wordlist.db,2
        wordlist R,system,/var/spool/bogofilter/wordlist.db,3

Esempio 3 - preferisce il dizionario di sistema a quello dell'utente:

        wordlist R,user,~/wordlist.db,5
        wordlist R,system,/var/spool/bogofilter/wordlist.db,4

Nota 1: le opzioni di bogofilter per la registrazione (`-s`, `-n`, `0u`, `-S`, `-N`) si applicheranno alla lista con numerazione inferiore.

Nota 2: non è consentito avere liste di tipo 'R' e 'I' con la stessa priorità perché i tipi sono contraddittori.

## Posso dire a bogofilter di ignorare certi termini?

Bogofilter ignorerà i termini contenuti in una lista da ignorare nell'assegnare il punteggio al messaggio.

Esempio:

     wordlist I,ignore,~/ignorelist.db,7
          wordlist R,system,/var/spool/bogofilter/wordlist.db,8

Poiché `ignorelist.db` ha un indice (7) minore di `wordlist.db` (8), bogofilter smetterà di cercare una volta trovato un termine in `ignorelist.db`.

Nota: tecnicamente, bogofilter assegna un punteggio di ROBX ai termini e li esclude alla valutazione del parametro min_dev.

Ci sono due metodi per creare/mantenere una lista di termini da ignorare.

Primo, un file di testo può essere creato e mantenuto usando un qualsiasi editor di testi. Bogoutil può convertire il file di testo nel formato database, es.: `bogoutil -l ignorelist.db < ignorelist.txt`.

Alternativamente `echo ... | bogoutil ...` può essere utilizzato per aggiungere un singolo termine, per esempio "ignorami", come segue:

      echo ignore.me | bogoutil -l ~/ignorelist.db

## Come faccio ad aggiornare da un database di termini separati al formato con liste di termini combinate?

Lancia lo script bogoupgrade. Per maggiori informazioni lancia `bogoupgrade -h` per visualizzare il suo messaggio di aiuto o esegui `man bogoupgrade` per leggere la sua pagina di manuale.

## Come faccio a capire se le mie liste di termini sono corrotte?

NOTA: alcuni distributori rinominano tutte le utilità db_ nominate di seguito inserendo o postponendo il numero di versione, con o senza punti; per esempio db4.1_verify o db_verify4.2. Non esiste uno standard nel rinominare queste utilità.

Se pensi che i tuoi dizionari contengano errori, puoi vedere cosa ne pensa BerkeleyDB lanciando

        db_verify wordlist.db

Potresti riuscire a recuperare alcuni (o tutti) i termini e i loro valori con i seguenti comandi:

        bogoutil -d wordlist.db | bogoutil -l wordlist.new.db

oppure - se c'è stati un danno maggiore all'elenco dei temini - con

        db_dump -r wordlist.db > wordlist.txt
        db_load wordlist.new.db < wordlist.txt

Puoi anche usare un file di testo al posto della concatenazione, come segue:

        bogoutil -d wordlist.db > wordlist.txt
        bogoutil -l wordlist.db.new < wordlist.txt

## Come converto la mia lista di termini in/da unicode?

I dizionari possono essere convertiti dal formato grezzo a unicode usando:

        bogoutil -d wordlist.db > wordlist.raw.txt
        iconv -f iso-8859-1 -t utf-8 < wordlist.raw.txt > wordlist.utf8.txt
        bogoutil -l wordlist.db.new < wordlist.utf8.txt

oppure

        bogoutil --unicode=yes -m wordlist.db

I dizionari possono essere convertiti da unicode al formato grezzo usando:

        bogoutil -d wordlist.db > wordlist.utf8.txt
        iconv -f utf-8  -t iso-8859-1 < wordlist.utf8.txt > wordlist.raw.txt
        bogoutil -l wordlist.db.new < wordlist.raw.txt

oppure

        bogoutil --unicode=no -m wordlist.db

I metodi sopra citati funzionano meglio quando il dizionario è basato sul set di caratteri iso-8859-1. Se il tuo dizionario è basato su un set di caratteri differente, per esempio CP866 o KOI8-R, usa quel set di caratteri nei comandi presentati.

Per un dizionario contenente termini in molteplici lingue, in particolare lingue non europee, i metodi di conversione appena descritti potrebbero non funzionare bene. La costruzione di un nuovo dizionario (da zero) funzionerà sicuramente meglio perché sarebbe basato unicamente su unicode.

## Come passo dalla modalità non-transaction a quella transaction?

La procedura è ampiamente documentata nel file doc/README.db sezione 2.2.1. Ti suggeriamo di leggere l'intera sezione.

In breve, usa questi comandi:

        cd ~/.bogofilter
        bogoutil -d wordlist.db > wordlist.txt
        mv wordlist.db wordlist.db.old
        bogoutil --db-transaction=yes -l wordlist.db < wordlist.txt

Se tutto è andato bene, puoi rimuovere i file di backup:

        rm wordlist.db.old wordlist.txt

## Come passo dalla modalità transaction a quella non-transaction?

La procedura è ampiamente documentata nel file doc/README.db sezione 2.2.2. Ti suggeriamo di leggere l'intera sezione.

In breve, puoi usare bogoutil per stampare/caricare il dizionario, per esempio:

        cd ~/.bogofilter
        bogoutil -d wordlist.db > wordlist.txt
        mv wordlist.db wordlist.db.old
        rm -f log.?????????? __db.???
        bogoutil --db-transaction=no -l wordlist.db < wordlist.txt

## Perché bogofilter muore dopo aver stampato "Lock table is out of available locks" oppure "Lock table is out of available object entries"?

Le modalità transaction e concurrent del BerkeleyDB richiedono una tabella dei lock che corrisponda in dimensione al database. Vedi il file README.db per una spiegazione dettagliata e una soluzione al problema.

La dimensione della tabella dei lock può essere impostata in bogofilter.cf o in DB_CONFIG. Bogofilter.cf usa le direttive db_lk_max_locks e db_lk_max_objects, mentre DB_CONFIG usa le direttive set_lk_max_objects e set_lk_max_locks.

Dopo aver cambiato questi valori in DB_CONFIG, lancia il comando

     bogoutil --db-recover /your/bogofilter/directory

perricompilare le tabelle dei lock.

## Perché ottengo messaggi DB_PAGE_NOTFOUND?

Hai un problema con il BerkeleyDB database. Ci sono due cause probabili: o hai raggiunto un limite di dimensione massima o il database è corrotto.

Alcuni MTA, come Postfix, impongono dei limiti alla dimensione dei file. Quando il database di bogofilter raggiunge quel limite, si avranno problemi in scrittura.

Per vedere la dimensione del database usa:

        ls -lh $BOGOFILTER_DIR/wordlist.db

Per vedere l'impostazione di postfix:

        postconf | grep mailbox_size_limit

Per impostare il limite a 73MB (o qualunque altra sia la dimensione giusta per te):

        postconf -e mailbox_size_limit=73000000

Se pensi che il tuo database si possa esser corrotto, leggi la domanda Come faccio a capire se le mie liste di termini sono corrotte?

## Perché ottengo "Berkeley DB library configured to support only DB_PRIVATE environments" o "Berkeley DB library configured to support only private environments"?

Alcuni distributori (per esempio il Fedora project) preparano il pacchetto BerkeleyDB con il supporto per i thread POSIX e quindi per i mutex POSIX, ma il tuo sistema non supporta i mutex POSIX (che lo faccia o meno dipende dalla versione del kernel e dall'esatto tipo di processore).

Per risolvere questo problema:

1. scarica, compila e installa BerkeleyDB per conto tuo e poi riconfigura bogofilter:
   1. `cd build_unix`
   2. `../dist/configure --enable-cxx`
   3. `make`
   4. `make install`
2. Ricompila ed installa bogofilter:
   1. `./configure --with-libdb-prefix=/usr/local/BerkeleyDB.4.3` (sostituisci con la tua versione di Berkeley DB)
   2. `make && make check`
   3. `make install` (se lo spazio è prezioso usa `make install-strip)`

## Bogofilter può essere usato in un ambiente multiutente?

Sì, è possibile. Ci sono multiple, distinte strategie per farlo. I due estremi sono:

- c'è un amministratore di bogofilter che mantiene un dizionario globale che tutti usano
- ogni utente mantiene un proprio dizionario.

Nel mezzo, l'amministratore di bogofilter può creare e mantenere i dizionari globali e a ogni utente può essere data la scelta di usare un dizionario globale o uno privato. Un MDA, come procmail, può essere programmato per applicare prima il dizionario globale (con un valore di soglia dello spam molto stringente) e poi (se necessario) applicare il dizionario dell'utente.

## Posso condividere le liste di termini attraverso NFS?

Se le stai solo leggendo, non ci sono problemi. Se le vuoi aggiornare, allora hai bisogno di usare il meccanismo di blocco dei file corretto per evitare perdite di dati. Quando compili bogofilter, dovrai verificare che lo script di configurazione abbia impostato `#define HAVE_FCNTL 1` nel tuo config.h. I più diffusi sistemi operativi UNIX supporteranno tutti questa opzione. Se stai usando un sistema operativo atipico, o una versione più vecchia, accertati che supporti fcntl(). Se il tuo sistema non supporta fcntl(), allora non potrai condividere i file di dizionario attraverso NFS senza il rischio di corruzione dei dati.

Poi, accertati di avere configurato correttamente NFS, con "lockd" in esecuzione. Fai riferimento alla documentazione di NFS per maggiori informazioni sull'esecuzione di 'lockd' o 'rpc.lockd'. La maggior parte dei sistemi operativi con NFS lo attivano automaticamente.

Per le directory condivise (directory NFS usate da macchine multiple, per esempio, Sparc/Itanium/Alpha e x86), le parti specifiche per l'architettura può essere installata separatamente dando un diverso `--exec-prefix` (quello predefinito sarà `--prefix`).

## Perché bogofilter restituisce codici come 0 e 256 quando viene lanciato dall'interno di un programma?

Probabilmente i return codes sono stati riformattati da waitpid(2). In C usa WEXITSTATUS(status) in sys/wait.h, o una macro simile, per ottenere il valore corretto. In Perl puoi usare semplicemente 'system("bogofilter $input") >> 8'. Se vuoi maggiori informazioni digita `"man waitpid"`.

## Ora che ho aggiornato perché si sono corrotti i miei scripts?

Nel tempo bogofilter ha accumulato un gran numero di funzioni. Alcune di queste sono state abbandonate o modificate. Leggi il file NEWS per i dettagli.

## Ora che ho aggiornato perché bogofilter sta lavorando peggio?

Il lexer, ovvero la parte di bogofilter che estrae i termini da un messaggio, si evolve. Questo comporta letture differenti dei messaggi con la conseguenza che alcuni termini nel database non possono più essere usati.

Se ti imbatti in questo problema sei caldamente invitato a ricostruire il tuo database. Se ciò non è possibile per te, potresti voler usare la versione 0.15.13 e leggere la documentazione allegata per sapere come migrare il tuo database.

## Come posso eliminare tutti i token dello spam (o quelli non-spam)?

Bogoutil ti permette di stampare un dizionario e di caricare i termini in uno nuovo. Attraverso l'uso di awk e grep i conteggi possono essere azzerati e i termini con valori pari a zero per spam e non spam possono essere eliminati.

I seguenti comandi elimineranno i termini dai messaggi di spam:

        bogoutil -d wordlist.db | \
        awk '{print $1 " " $2 " 0"}' | grep -v " 0 0" | \
        bogoutil -l wordlist.new.db

I seguenti comandi elimineranno i termini dai messaggi non spam:

        bogoutil -d wordlist.db | \
        awk '{print $1 " 0 " $3}' | grep -v " 0 0" | \
        bogoutil -l wordlist.new.db

## Come faccio a far funzionare bogofilter su Solaris, BSD, ecc?

Se non hai già una versione 3.0 o maggiore di BerkeleyDB, allora scaricala (prendi una tra le versioni 4.4.X, 4.3.X o 4.2.X), scompattala ed esegui questi comandi nella directory db:

        $ cd build_unix
        $ sh ../dist/configure
        $ make
        # make install

Poi scarica una versione portabile di bogofilter.

### Su Solaris

Assicurati che la tua variabile d'ambiente PATH inizi con `/usr/xpg6/bin:/usr/xpg4/bin:/usr/ccs/bin` (/usr/xpg6/bin esiste solo su Solaris 10 e può essere omessa su Solaris 9 e versioni precedenti). Ciò è richiesto per compatibilità POSIX.

Scompattalo, e digita:

        $ ./configure --with-libdb-prefix=/usr/local/BerkeleyDB.4.4
        $ make
        # make install-strip

Potresti voler mettere un collegamento simbolico a libdb.so sotto /usr/lib, o usare una variabile d'ambiente LD_LIBRARY_PATH modificata prima di lanciare bogofilter. Su sistemi recenti, la via più conveniente è di usare `crle(1)` per impostare il percorso permanentemente in modo che BerkeleyDB sia disponibile per tutte le applicazioni.

        $ LD_LIBRARY_PATH=/usr/lib:/usr/local/lib:/usr/local/BerkeleyDB.4.4
        $ export LD_LIBRARY_PATH

Nota che alcune versioni di `make` fornite con vecchie versioni di Solaris falliscono se tenti di compilare bogofilter fuori dalla sua directory dei sorgenti. Compila nella directory dei sorgenti (come suggerito sopra) o usa GNU make (`gmake`).

Se il tuo Solaris GCC si lamenta dicendo "ld: fatal: file values-Xa.o: open failed: No such file or directory", installa il pacchetto SUNWarc.

### Su FreeBSD

La collezione di ports di FreeBSD fornisce la più recente versione stabile di bogofilter. Questo approccio usa i pacchetti di software portupgrade e portsnap, altamente raccomandati. Per installare pirtupgrade digita (dovrai farlo solo una volta), come root:

        # pkg_add -r portupgrade

Su versioni di FreeBSD più recenti portsnap fa parte del sistema base. Se digitando `portsnap help` non viene stampata la pagina di aiuto di portsnap devi installarlo dai ports. Per farlo (basta una volta soltanto) digita, come root:

        # pkg_add -r portsnap

Per installare o aggiornare bogofilter, basta aggiornare il tuo albero dei ports usando portsnap, poi digita, come root:

        # portupgrade -N bogofilter

Nota: si suppone che tu sia root. Se non è questo il caso, leggi il seguito di questa sezione su FreeBSD e guarda come puoi compilare se non hai i privilegi di root.

A seconda del tuo sistema potresti dover impostare alcune variabili d'ambiente per il comando `./configure`. Per esempio:

        $ env CPPFLAGS=-I/usr/local/include/db3 LIBS=-ldb3 LDFLAGS=-L/usr/local/lib ./configure

I percorsi reali da usare qui dipendono dal tuo sistema e dalle versioni di database che sono installate. Controlla e sostituisci di conseguenza.

### Su NetBSD e altri sistemi che usano "pkgsrc"

pkgsrc dovrebbe offrire una versione stabile di bogofilter ragionevolmente recente. Vedi http://www.pkgsrc.org/ per informazioni su pkgsrc.

### Su HP-UX

Leggi il file doc/programmer/README.hp-ux nella distribuzione con i sorgenti.

## Posso usare il comando make sul mio sistema operativo?

Bogofilter è stato compilato correttamente su molti sistemi operativi usando GNU make e i comandi nativi di make. Comunque, il Makefile di bogofilter non funziona con alcuni make.

GNU make è raccomandato per compilare bogofilter perché noi sappiamo come lavora. Non possiamo supportare comandi make meno potenti. Se il tuo comando make non GNU riesce a compilare correttamente bogofilter, va benissimo. Se però incontri problemi la cosa giusta da fare è installare GNU make. Se il tuo make non-GNU non può compilare bogofilter, ci spiace ma sarai da solo. Se richiede soltanto una minima e pulita patch per renderlo compatibile, potremmo includerla.

## Come compilo bogofilter come utente non-root per installarlo in una directory non standard?

Per installare bogofilter in un percorso non standard (come utente non-root non hai i permessi per le directory normali) hai bisogno di fornire il prefisso d'installazione quando lanci `./configure`.

Dopo aver scaricato e scompattato il codice sorgente, lancia `./configure --prefix=PATH` dove PATH è il prefisso di installazione per i file generati (binari, pagine man, ecc). Poi lancia i soliti comandi di compilazione: `make && make check && make install`

## Come compilo bogofilter con le patch?

Se hai bisogno di applicare delle patch, recupera il codice sorgente e scompattalo usando `tar -xzf` o `gunzip | tar -xf -` (come appropriato). Spostati nella directory dei sorgenti e lancia `./configure --prefix=PATH` dove PATH è il prefisso di installazione per i file generati (binari, pagine man, ecc). Applica le tue patch e poi lancia `make && make install`.

## Come rendo gli eseguibili più piccoli?

Quando lo spazio è scarso, puoi usare `make install-strip` al posto di `make install`. Così facendo risparmierai spazio, ma i crash non potranno essere debuggati a meno che maggiori informazioni sul come riprodurre il crash non vengano fornite agli sviluppatori.

## datastore_db.c non compila!

Se stai configurando il percorso di un database, per esempio con --with-libdb-prefix o attraverso CPPFLAGS e LIBS, accertati di passare un percorso assoluto (con barra iniziale), un percorso relativo non funzionerebbe. Esempio: usa `--with-libdb-prefix=/usr/local/BerkeleyDB.4.2`, ma non `--with-libdb-prefix=../BerkeleyDB.4.2`.

## Con quali programmi di posta funziona bogofilter?

Sappiamo che bogofilter funziona con kmail, mozilla-mail, mutt, alpine, sylpheed-claws. Una ricerca con google ti aiuterà a trovare maggiori informazioni sull'utilizzo di bogofilter insieme al programma di posta che utilizzi.

## Come uso bogofilter con mutt?

Usa un filtro per la posta elettronica (procmail, maildrop, ecc) per dividere i messaggi in gruppi differenti in base al return code di bogofilter e imposta delle associazioni di tasti per l'apprendimento basato sugli errori:

        macro index S "|bogofilter -s\ns=junkmail"  "Ricorda come spam e cestinalo"
        macro pager S "|bogofilter -s\ns=junkmail"  "Ricorda come spam e cestinalo"
        macro index H "|bogofilter -n\ns="          "Ricorda come ham e salvalo"
        macro pager H "|bogofilter -n\ns="          "Ricorda come ham e salvalo"

Queste associazioni filtreranno il messaggio selezionato attraverso bogofilter, indicandogli un falso-ham come spam o viceversa, e poi proponendo di salvare il messaggio in una destinazione differente.

## Come uso bogofilter con Sylpheed Claws?

Aggiungi un filtro per passare a bogofilter i messaggi in arrivo e un'azione da eseguire se si tratta di spam:

        condition:
        * test "bogofilter < %F"
        action:
        * move "#mh/YOUR_SPAM_BOX"

Nota: si assume che bogofilter sia nel tuo path!

Crea due azioni Claws - una per segnare i messaggi come spam e l'altra per segnarli come ham. Usa l'azione "Segna come Spam" per i messaggi erroneamente classificati come ham e usa "Segna come Ham" su quelli erroneamente classificati come spam.

        Mark as ham / spam:
        * bogofilter -n -v -B "%f" (mark ham)
        * bogofilter -s -v -B "%f" (mark spam)

Un altro approccio consiste nel salvare i messaggi non riconosciuti correttamente in una cartella e lanciare uno script come:

        #!/bin/sh
        CONFIGDIR=~/.bogofilter
        SPAMDIRS="$CONFIGDIR/spamdirs"
        MARKFILE="$CONFIGDIR/lastbogorun"
        for D in `cat "$SPAMDIRS"`; do
    	find "$D" -type f -newer "$MARKFILE" -not -name ".sylpheed*"
        done|bogofilter -bNsv
        touch "$MARKFILE"

Questo script può essere utilizzato come un'azione e/o associato ad un pulsante della barra degli strumenti. Registrerà come spam i messaggi contenuti in ${SPAMDIRS} che sono più recenti di ${MARKFILE}.

Maggiori informazioni sono disponibili sul wiki di Claws.

Un altro approccio è di lanciare bogofilter da procmail, maildrop, ecc e far controllare a Claws l'intestazione X-Bogosity e filtrare i messaggi nelle cartelle Spam e Incerti, es.:

        Condition:
    	header "X-Bogosity" matchcase "Spam"
        Action:
    	move "#mh/Mailbox/Spam"
        Condition:
    	header "X-Bogosity" matchcase "Unsure"
        Action:
    	move "#mh/Mailbox/Unsure"

Qualsiasi messaggio nella cartella Incerti dovrebbe essere usato per l'apprendimento; lo stesso per i messaggi classificati in modo errato come ham o spam. Le azioni seguenti gestiranno questi casi:

        Register Spam:
    	bogofilter -s < "%f"

        Register Ham:
    	bogofilter -n < "%f"

        Unregister Spam:
    	bogofilter -S < "%f"

        Unregister Ham:
    	bogofilter -N < "%f"

Per vedere all'interno del sistema di assegnazione dei punteggi di bogofilter, i seguenti strumenti diagnostici sono utili:

        BogoTest -vv:
    	bogofilter -vv < "%f"

        BogoTest -vvv:
    	bogofilter -vvv < "%f"

Ulteriori informazioni su questo approccio sono disponibili all'indirizzo http://www.bogofilter.org/pipermail/bogofilter/2005-March/007815.html.

## Come uso bogofilter con VM (uno strumento di Emacs per la posta)?

Devi includere il file separato vm-bogofilter.el (contenuto nella directory contrib di bogofilter; la versione più recente del file si trova presso http://www.cis.upenn.edu/~bjornk/bogofilter/vm-bogofilter.el) nel path del tuo emacs.

Poi, aggiungi solo nel tuo file di configurazione ~/.vm:

    ;; load bogofilter capabilities (spam)
    ;;
    (require 'vm-bogofilter)

    ;; short-key for bogofilter
    ;; C (shift-c) means spam message
    ;; K (shift-k) means ham message
    (define-key vm-mode-map "K" 'vm-bogofilter-is-spam)
    (define-key vm-mode-map "C" 'vm-bogofilter-is-clean)

Tutti i messaggi vengono filtrati da bogofilter ogni volta che controlli se è arrivata nuova posta. Quando modifichi lo stato di un messaggio, l'intestazione di bogofilter (X-Bogosity) viene modificata.

C'è un limite: non puoi modificare le intestazioni di più messaggi alla volta in VM; dovrai farlo un messaggio alla volta.

## Come uso bogofilter con MH-E (l'interfaccia Emacs al sistema di posta MH)?

Il valore predefinito dell'opzione 'mh-junk-program' è 'Auto-detect' che significa che MH-E sceglierà automaticamente uno tra SpamAssassin, Bogofilter o SpamProbe nell'ordine specificato. Se, per esempio, hai sia SpamAssassin che Bogofilter installati e vuoi utilizzare Bogofilter, puoi assegnare a quest'opzione il valore 'Bogofilter'.

Il comando 'J b' ('mh-junk-blacklist') istruisce il programma antispam in uso con il contenuto nell'intervallo e poi manipola i messaggi come indicato dall'opzione 'mh-junk-disposition'. Normalmente questa opzione è impostata come 'Elimina spam' ma puoi anche specificare il nome della cartella che è utile per la costruzione di un gruppo di messaggi di spam per scopi di apprendimento.

Per contrasto, il comando 'J w' ('mh-junk-whitelist') riclassifica un intervallo di messaggi come spam se erano stati classificati erroneamente come spam. Esso poi riporta i messaggi nella cartella '+inbox'.

Per maggiori informazioni, vedi la home page di MH-E.