Una soluzione SQL valias con sieve per qmail. Nuove patch e un plugin per Roundcube

5 novembre 2023 by Roberto Puzzanghera 0 commenti

Changelog

  • Nov 5, 2023
    -bug fix: vpopmail defaultdelivery patch: it won't create the .qmail file in case control/defaultdelivery already has vdelivermail, in order to prevent a vpopmail loop
    -qmailforward RC plugin: it won't create the copy record if $config['qmailforward_defaultdelivery'] contains 'vdelivermail'

Tra i vari problemi che mi ero proposto di affrontare prima o poi credo di averne definitivamente risolto uno: l'impossibilità di avere le sieve rules e allo stesso tempo gli alias di vpopmail salvati su database (--enable-valias).

Ma prima di presentare le soluzioni, facciamo un po’ di chiarezza sul problema da risolvere, che tra l’altro è stato discusso più volte anche nei commenti di questo blog. Non a caso la soluzione da me individuata è stata in parte ispirata dalla (ri)lettura di alcuni post dei visitatori.

Il problema

Normalmente vpopmail copia il proprio delivery agent (vdelivermail) nel file .qmail-default file dei domini appena creati. Ciò rende impossibile usare i filtri di Dovecot basati sulle regole sieve, dato che questo richiederebbe l’utilizzo di Dovecot-LDA.

Per contro, se poniamo in .qmail-default il delivery agent di dovecot al fine di avere le sieve rules, quando l’utente userà i filtri per generare un reinoltro causerà senza volerlo la violazione delle regole SPF, perché qmail, essendo ora fuori causa, non potrà lanciare srsfilter per riscrivere l’indirizzo del mittente. Per lo stesso motivo, gli alias salvati su MySQL sono irraggiungibili, quando si opta per Dovecot che non ha nulla a che fare con essi.

Sono problemi che conosciamo bene a causa delle mail di protesta degli utenti che si vedono rimbalzare indietro i loro messaggi di inotro. Ma ora ci daremo una sistemata una volta per tutte :-)

La soluzione

Come sappiamo è possibile lasciare vdelivermail nei .qmail-default appartenenti ai domini, e lanciare Dovecot-LDA attraverso i file .qmail scritti nella cartella home utente. Ad esempio:

domains/
  |
  |
  --- sagredo.eu/
  |
  |
  --- .qmail-default (| ~vpopmail/bin/vdelivermail '' delete)
  |
  |
  --- roberto/
         |
         |
         --- .qmail (|/var/qmail/bin/preline -f /usr/local/dovecot/libexec/dovecot/deliver -d $EXT@$USER)

In tal modo l'eventuale gestione dei forward e con esso il lancio di srsfilter, sia nella modalità dot-qmail che nella modalià virtuale su MySQL/valias, viene fatta preventivamente da qmail/vpopmail, mentre il salvataggio definitivo dei messaggi e con essi l’esecuzione delle sieve rules (filtri) viene svolta successivamente da Dovecot, al momento dell’apertura del file .qmail dell’utente.

La nuova patch per vpopmail che ho preparato gestirà la creazione dei nuovi domini e utenti e dei corrispettivi file dot-qmail secondo questa logica, quando si configura vpopmail con l’opzione –enable-defaultdelivery.

L’aggiornamento di vpopmail porta con se un mio programma vmakedotqmail che può essere di aiuto nella migrazione a valias, per creare o riscrivere in automatico i file dot-qmail, come vedremo dopo.

I forward su valias

Da ora in poi sarà anche possibile salvare i forward su MySQL (vpopmail compilato con –enable-valias). Inserirò questa impostazione in questa guida e ricordo perché ciò è importante.

Allo stato attuale delle cose la gestione di questi reinoltri (con eventuale copia in mailbox) sulle caselle utente può essere fatto solo tramite qmailadmin dall’amministratore del dominio, che ovviamente non ha il tempo per soddisfare certe richieste che, in un sistema organico e ben fatto, dovrebbero invece essere appannaggio dell’utente stesso.

Avere i forward utente su MySQL apre alla possibilità di costruire programmi web per la loro gestione, come ad esempio un plugin per Roundcube, cosa che infatti vi trovate nel pacchetto di programmi che sto rilasciando qui.

Aggiornamento del proprio server

vpopmail

La nuova patch defaultdelivery per vpopmail funziona diversamente rispetto a prima, ovvero secondo la logica illustrata sopra. E’ necessario scaricare la nuova patch e reinstallare vpopmail al solito modo.

Se si desidera, come credo, utilizzare i valias e con essi il mio plugin qmailforward plugin per Roundcube, è necessario compilare vpopmail con –enable-valias e successivamente aggiornare lo schema della tabella valias.vpopmail, a meno che questa tabella sia ancora inesistente e allora sarà lo stesso vpopmail a crearla per noi. Si potrebbe anche decidere di cancellare quella tabella e lasciarla ricreare a vpopmail, se essa è vuota oppure contiene solo pochi record che possiamo ricreare facilmente in poco tempo.

Ecco dunque cosa fare per quanto riguarda vpopmail:

./configure \
  --other-options-here \
  --enable-mysql-limits \
  --enable-sql-aliasdomains \
  --enable-defaultdelivery \
  --enable-valias

make
make install-strip

Ora ricompilare e reinstallare qmail

make
qmailctl stop
make setup check
qmailctl start

Nel caso sia necessario, questa è la query SQL da eseguire per modificare lo schema della tabella vpopmail.valias. Essa cerca di cancellare la PRIMARY KEY eventualmente già definita.

USE vpopmail;
ALTER TABLE valias DROP INDEX IF EXISTS `PRIMARY`;
ALTER TABLE `valias` ADD `valias_type` TINYINT(1) NOT NULL DEFAULT '1' COMMENT '1=forwarder 0=lda' FIRST;
ALTER TABLE `valias` ADD `copy` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '0=redirect 1=copy&redirect' AFTER `valias_line`;
ALTER TABLE `valias` ADD PRIMARY KEY (`valias_type`, `alias`, `domain`);

Notare come questa query va a sostituire eventuali chiavi primarie già esistenti, che comunque non ci sono nella installazione di default. Si tenga presente che la linea ALTER TABLE valias DROP INDEX IF EXISTS `PRIMARY` può causare errori se già esiste una PRIMARY KEY con l'opzione AUTO_INCREMENT attiva. In questo caso è necessario cancellare manualmente la colonna con la PRIMARY KEY e procedere con le ultime tre linee.

Come già accennato, ho scritto un programmino che può essere di aiuto per riscrivere i propri dot-qmail. Come già anticipato, esso copia il contenuto di control/defaultdelivery nel .qmail delle mailbox utente e il programma vdelivermail (o quello chesi vuole) nel .qmail-default dei domini. Ecco come funziona:

# vmakedotqmail -h 

Usage: vmakedotqmail [option] [argument] 

options: -u <username@domain>  install .qmail for the user <username@domain> 
         -d <domain>           install .qmail for all users of domain <domain> 
         -A                    install .qmail for all users of all domains 
         -o (overwrite)        do not skip existing .qmail files. Use with -A|-d|-u 
         -r (reverse)          remove the existing .qmail files. Use with -A|-d|-u 
         -q [default|argument] reinstall the .qmail-default in domain -d <domain> 
                               or in ALL domains (-A). 
         -t (testing mode)     do not really open or write the .qmail 
         -h                    this help 

Existing .qmail files won't be overwritten unless you pass -o 

Examples:

       Install control/defaultdelivery to .qmail of all mailboxes of all domain (overwrite -o active) 
       vmakedotqmail -o -A 

       Install control/defaultdelivery to .qmail of user <username@domain> (skip if existing) 
       vmakedotqmail -o -u <username@domain> 

       Install .qmail-default with vdelivermail (delete option) for domain 'domain.tld' 
       vmakedotqmail -d domain.tld -q default 

       Install .qmail-default with your favourite LDA for all domains 
       vmakedotqmail -A -q "My LDA instruction as quoted argument here" 

       Remove all existing .qmail from all mailboxes of domain <domain> 
       vmakedotqmail -r -d <domain>

qmailadmin

Riscaricare il programma, che presenta alcuni aggiustamenti riguardanti i virtual alias, ricompilare e installare al solito modo.

Ricompilare qmailadmin dopo aver reinstallato e configurato vpopmail è sempre necessario.

Plugin qmailforward per Roundcube

L’idea di base che sta dietro questo plugin è di Michael Dick, che ringrazio.

qmailforward riprende il codice php che serve a generare il form dal plugin managesieve, che già mette a disposizione l’inoltro, ma al costo di utilizzare le regole sieve, come già detto. Se lo si è abilitato, disabilitare quel plugin per non confonderlo con questo.

$config['managesieve_forward'] = 0;

qmailforward mette l'utente in condizioni di gestire il proprio reinoltro (con eventuale copia) attraverso il pannello delle impostazioni di Roundcube.

Per installarlo è sufficiente scaricarlo da github, scompattare nella cartella plugin, dove dovrà comparire una cartella qmailforward, e abilitare dalle impostazioni di Roundcube.

$config[‘plugins’] = […… ,‘qmailforward’];

In alternativa è possibile eseguire una installazione automatica via composer.

Nel file config.inc.dist.php ci sono le impostazioni di default. Leggere questo file e copiare le impostazioni che si vuole sovrascrivere in config.inc.php. E’ necessario inserire almeno le credenziali di accesso al database, che sono quelle di vpopmail ricavabili dal file ~vpopmail/etc/vpopmail.mysql.

Il plugin si presenta così e non ha bisogno di spiegazioni sulle modalità di utilizzo:

Per chi è curioso di sapere cosa succede nella tabella vpopmail.valias, qmailforward può comportarsi in due modi:

  1. come un reinoltro semplice. In tal caso viene scritto un solo record con il destinatario nel campo valias_line. Qui il nuovo campo copy assume valore 0, mentre valias_type sarà uguale a 1.
  2. come inoltro di una copia del messaggio. Lo stesso di prima, ma il campo copy sarà in questo caso uguale a 1, con valias_type=1. In aggiunta a ciò verrà inserito un altro record di natura diversa riconoscibile perchè  valias_type=0 che conterrà il delivery agent responsabile del salvataggio della copia in mailbox. Si può configurare quale delivery agent usare attraverso il file di configurazione. Per default sarà Dovecot, di modo che vengano pure eseguite in cascata le regole sieve. No utilizzare vdelivermail come opzione, che già è installato in .qmail-default, altrimenti si causerà un loop di vpopmail e un conseguente errore di qmail-queue.

La chiave primaria che abbiamo aggiunto alla tabella è necessaria per le query di scrittura sul database, quindi non modificatela.

Il plugin ha le sole traduzioni in inglese e in italiano. Per favore collaborate nella traduzione in altre lingue e inviatemele via mail (cartella localization).


Quanto sopra è codice fresco e pertanto va considerato ancora come testing. Come sempre, non esitate a postare eventuali informazioni, suggerimenti e problematiche nei commenti qui sotto.

Questo è tutto, have fun!

Aggiungi un commento