Changelog
- Jan 10, 2024
- fixed a bug in vpopmail which was preventing the correct auto creation of the valias table in MySQL - 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` 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 INDEX (`valias_type`, `alias`, `domain`);
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:
- come un reinoltro semplice. In tal caso viene scritto un solo record con il destinatario nel campo
valias_line
. Qui il nuovo campocopy
assume valore0
, mentrevalias_type
sarà uguale a1
. - come inoltro di una copia del messaggio. Lo stesso di prima, ma il campo
copy
sarà in questo caso uguale a1
, convalias_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 regolesieve
. No utilizzarevdelivermail
come opzione, che già è installato in .qmail-default, altrimenti si causerà un loop divpopmail
e un conseguente errore diqmail-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!