Installazione e configurazione di SpamAssassin
10 settembre 2025 by Roberto Puzzanghera 2 commenti
- Info: http://spamassassin.apache.org/
- Documentazione: http://spamassassin.apache.org/full/4.0.x/doc/
- Versione usata: 4.0.2
- Scarica: http://spamassassin.apache.org/downloads.cgi
- Note sull'aggiornamento: https://svn.apache.org/repos/asf/spamassassin/trunk/UPGRADE
- github: https://github.com/apache/spamassassin
SpamAssassin is a mature, widely-deployed open source project that serves as a mail filter to identify Spam. SpamAssassin uses a variety of mechanisms including header and text analysis, Bayesian filtering, DNS blocklists, and collaborative filtering databases. SpamAssassin runs on a server, and filters spam before it reaches your mailbox.
Changelog
- Sep 11, 2025
-txrep
is working badly in a server where data were not completely deleted. Read the updates below - Sep 10, 2025
- spamassassin aggiornato alla versione 4.0.2
- aggiunta una pagina dove il vecchio problema sul driver MySQL/MariaDB viene risolto. - May 31, 2025
- We are know denying validity, as it is imposing low limits and drastically blocking the queries (tx Shailendra Shukla).
daemontools
8 settembre 2025 by Roberto Puzzanghera 0 commenti
- Info: http://cr.yp.to/daemontools.html
- github
- Autore: D.J. Bernstein
- Versione: 0.81
daemontools è una collezione di strumenti per gestire servizi UNIX. Monitora i servizi di qmail e salva i messaggi di errore in uno o più logs.
Changelog
- Sep 8, 2025 (v. 0.81)
- compiles with latest gcc 15.2 - Aug 3, 2025
- multilog prints a readable datetime in milliseconds if used with "m" flag (thanks squidvisa) - Mar 19, 2025 (v. 0.79)
This version does not add new features nor corrects bugs. It's just a reorganizations of the files in the source dir
- daemontools will be installed in /var/qmail/daemontools
- Moved 'package' and 'src' to the top dir
- Version grabbed from 'VERSION' in package/upgrade - Feb 9, 2025 (v0.78.4)
- several adjustments to get clang version 18.1.6 compatibility
- restored !/bin/sh in all scripts - Oct 14, 2024 (version 0.78.3)
- all package/ scripts now run the bash shell
- package/run script will recognize if we are in an lxc container to skip inittab configuration
- package/run.rclocal will find both /etc/rc.local /etc/rc.d/rc.local
- daemontools-0.78.2 directory renamed to daemontools - Oct 9, 2024
- added -ltr to conf-ld to restore compatibility with systems with glibc prior to v. 2.17 like RHEL6/CentOS6, where the librt.so library is not linked - Oct 10, 2024
- version 0.78.1: added package/compile which was missing again! (tx Bai Borko) - Sep 6, 2024
- fixed a .gitignore issue which was preventing the package/compile script upload (thanks Ivelin Topalov) - Jul 29, 2024 (version 0.78)
- multilog prints a readable datetime if used with "d" flag, it prints timestamps if used in the usual way with the "t" flag (80f2133)
- fixed several compilation warnings and/or breaks on gcc-14.1 - Dec 9, 2023
-moved my patched daemontools to github and called 0.77 the new version
-clear service moved to qmail/supervise/clear
Aggiornare qmail
8 settembre 2025 by Roberto Puzzanghera 18 commenti
- Latest version 2025.09.08 (github)
- Changelog
- Readme
Per mia comodità ho spostato i sorgenti di qmail
sources nel mio spazio github
. Ciononostante, tutte le informazioni riguardanti qmail
e programmi correlati continueranno a essere riportate in questo spazio web, e questo spazio rimarrà il luogo ove chiedere eventualmente supporto. Da ora in poi, annzichè rilasciare una patch combinata, rilascerò un pacchetto da scaricare da github
, che sarà ovviamente il risultato dell'accomodamento delle patch elencate sotto più varie modifiche che verranno indicate nei commit di github.
Changelog
- Sep 8, 2025
- Fixes in SPP handling and support for [pass] plugins after RCPT accept. Support for RBLRESULT environment variable and RBL ignore ('=') option. (tx Andreas Gerstlauer)
- Added -std=gnu17 to conf-cc, fixed some other issues and now it compiles on gcc-15.2 in #28
- scripts/qmail-pop3d and qmail/pop3sd: ports changed to 110 and 995
- Received: email header now hides the sender's hostname when the sender is RELAYCLIENT or is authenticated. 785e84b - Jul 10, 2025
- Authentication-Results: header support (Andreas Gerstlauer)- DKIM
: addedERROR_FD=2
in control/filterargs to send error output ofqmail-dkim
in stderr when acting as aqmail-remote
filter (Andreas Gerstlauer)
- improvedqmail-dkim
error reporting when signing outgoing messages (Andreas Gerstlauer)
-helodnscheck.cpp:
qmail
dir determined dinamically
-qmHandle:
Add-x
and-X
parametr for remove email by To/Cc/Bcc (by Stetinac) - Jun 9, 2025
- CRLF fix for fastremote-3 patch (thanks Andreas Gerstlauer)
- Bug fix to the greetdelay program (thanks Andreas Gerstlauer): qmail-smtpd crashes if SMTPD_GREETDELAY is defined with no DROP_PRE_GREET defined.
- turned off TLS and helo dns check on qmail-smtpsd/run script (tx Luis) - Apr 30, 2025
,
qmailctlqmHandle
,queue_repair
and all scripts installed in QMAIL/bin and not in /usr/local/bin byconfig-all.sh
- Apr 25, 2025
- added a configuration script config-all, which configure and installs the control files (as per the original config-fast script), aliases, SRS (uses control/me as the srs_domain), log dirs in /var/log/qmail, tcprules (basic, just to make initial tests), supervise scripts,qmailctl
script, DKIM control/filterargs and control/domainkeys dir, SURBL,smtpplugins
,helodnscheck
spp plugin,svtools
,qmHandle
,queue-repair
, SSL key file (optional).
Consider this feature as "testing" - Feb 11, 2025
- Several adjustments to get freeBSD and netBSD compatibility. More info in the commit history. Hints/comments are welcome.
- freeBSD users have to erase the very 1st line of the file "conf-lib", as libresolv.so in not needed on freeBSD.
- Dropped files install-big.c, idedit.c and BIN.* files.
- Dropped files byte_diff.c, str_cpy.c, str_diff.c, str_diffn.c and str_len.c, which break compilation on clang and can be replaced by the functions shipped by the compiler (tx notqmail).
- Old documentation moved to the "doc" dir. install.c and hier.c modified accordingly
- conf-cc and conf-ld now have -L/usr/local/lib and -I/usr/local/include to look for srs2 library
- conf-cc and conf-ld now have -L/usr/pkg/lib and -I/usr/pkg/include to satisfy netBSD
- vpopmail-dir.sh: minor correction to vpopmail dir existence check
- srs.c: #include <srs2.h> now without path - Dec 01, 2024 (More info here)
- Added support for EAI (RFC 5336 SMTP Email Address Internationalization) (#13). Thanks to https://github.com/arnt/qmail-smtputf8/tree/smtputf8-tls. libidn2 package (libidn2-dev on debian) is a new dependence.
- chkuser is now smtputf8 compliant. It accepts utf8 characters in sender and recipient addresses provided that the remote server advertises the SMTPUTF8 verb in MAIL FROM, otherwise it allows only ASCII characters plus additional chars from the CHKUSER_ALLOWED_CHARS set. (#15 #16)
* dropped variables CHKUSER_ALLOW_SENDER_CHAR_xx CHKUSER_ALLOW_RCPT_CHAR_xx (replaced by CHKUSER_ALLOWED_CHARS)
* dropped variables CHKUSER_ALLOW_SENDER_SRS and CHKUSER_ALLOW_RCPT_SRS, as we are always accepting '+' and '#' characters
* added variables CHKUSER_INVALID_UTF8_CHARS and CHKUSER_ALLOWED_CHARS - Nov 10, 2024
- Added support for EAI (RFC 5336 SMTP Email Address Internationalization) (commit).libidn2
is required. Thanks to https://github.com/arnt/qmail-smtputf8/tree/smtputf8-tls.
- CHKUSER_SENDER_FORMAT and CHKUSER_RCPT_FORMAT have been commented out in chkuser_settings.h to get this feature working.
Let's consider this release a beta. Testers are welcome concerning the new SMTPUTF8 feature. - Oct 26, 2024
- qmail-remote.c patched to dinamically touch control/notlshosts/<fqdn> if control/notlshosts_auto contains any number greater than 0 in order to skip the TLS connection for remote servers with an obsolete TLS version. (tx Alexandre Fonceca) (commit)
- defined CHKUSER_DISABLE_VARIABLE "RELAYCLIENT" in chkuser_settings.h
- enabled CHKUSER_SENDER_NOCHECK_VARIABLE "RELAYCLIENT" in chkuser_settings.h
- fixed several compilation breaks/warnings on later gcc compilers (tx Pablo Murillo)
- invalid auth fix in qmail-smtpd.c's smtp_auth function (tx Alexandre Fonceca for the advice) (commit)
- qmail path determined dinamically in conf-policy
- added a patch to remove chkuser and the vpopmail dependency (patches dir) - Jan 11, 2024
- DKIM: dk-filter dropped
WARNING: IF YOU ARE UPGRADINGqmail
AND YOU ARE USING A VERSION BEFORE 2024.01.11, YOU HAVE TO RECONFIGURE DKIM AND MODIFY YOURrc
FILE ACCORDINGLY.
Installare e configurare VPopMail
1 settembre 2025 by Roberto Puzzanghera 6 commenti
- Versione di
vpopmail
: 5.6.9 - github: sagredo-dev/vpopmail
- Scarica
- Changelog completo
- README.vdelivermail
- Pagina originale di Inter7
Vpopmail fornisce un modo semplice di gestire indirizzi di posta su domini virtuali e account email diversi da quelli su /etc/passwd.
Changelog
- Sep 1, 2025 (v. 5.6.9)
- added -std=gnu17 to gain compatibility with gcc-15 (PR #6)
- pw_clear_passwd field enlarged to varchar(128) to create room for long passwords (tx Ricardo Brisighelli) c54688d - Mar 29, 2025
- defaultdelivery feature (--enable-defaultdelivery
) changes (more info here, commit):vdelivermail
is installed by default in .qmail-default of newly created domains with option 'delete' as in the previous version.- if no user's valiases and no .qmail are found, then the message is sent to the control/defaultdelivery file, so that dovecot-lda (or whatelse) can store the mail into inbox and execute the sieve rules.
- if vdelivermail is found in control/defaultdelivery, then it is ignored. The delivery remains in charge to
vdelivermail,
to avoid loops. - v. 5.6.8 is backward compatible. The users having .qmail from previous versions of the defauldelivery feature are not affected by this change.
- Mar 23, 2025 (v. 5.6.7)
- bug fix in vpopmaild.c: Crypted[64] enlarged to Crypted[128] to make room for SHA-512 passwords. This restores the usability of the RoundCube's 'password' plugin (commit)
- fixed quota calculation in sql procedures for dovecot (tx Hakan Cakiroglu) (commit)
- minor changes to the usage function of vmakedotqmail.c (commit) - Feb 15, 2025 (v. 5.6.6)
- bug fix: pwstr.h was not installed by Makefile (tx Bai Borko) - Feb 9, 2025
- added pwd strength check also for vadduser.c
- removed-std=c99 -D_XOPEN_SOURCE=500
arguments fromCFLAGS
in configure.ac to makeclang
happy
- several changes to compile on FreeBSD clang v. 18.1.6 - Dec 20, 2024 (v. 5.6.4)
- Password strength enforcement PR #5 (grabbed from Matt Brookings' 5.5.0-dev version)
- Dropped min pwd length feature.
- vmysql.h: tables' layout changed in order to have VARCHAR instead of CHAR. Fields containing ip addresses enlarged to VARCHAR(39), to create room for ipv6. Unix timestamps definition changed from BIGINT(20) to INT(11). (commit 44bad58) Have a look to the upgrade notes below. - Oct 14, 2024 (v. 5.6.3)
- fixed a configure break where a trivial C test program exits on error with gcc-14.1 due to missing headers
- vusaged/domain.c: fixed -Wimplicit-function-declaration compilation warning
- vmysql.h: dropped the multicolumn PRIMARY KEY in valias table to allow multiple forwards for a given alias.
In case one already has the valias table defined, this is the sql query for the upgrade:
ALTER TABLE `vpopmail`.`valias` DROP PRIMARY KEY, ADD INDEX (`alias`, `domain`, `valias_type`) USING BTREE;
ALTER TABLE `vpopmail`.`valias` ADD `id` INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`id`);
Aggiornare alla versione 5.6.x
Quando si passa dalla versione 5.4.33 alla versione 5.6.x, se si hanno gli account su SQL
, è necessario aumentare le dimensioni della colonna vpopmail.pw_passwd
del database, poichè il meccanismo di criptaggio delle password è ora basato su SHA512
, che è più lungo del vecchio MD5
; si può comunque scegliere di disabilitare le SHA512
pwd con --disable-sha512-passwords
al momento della configurazione. La colonna vpopmail.pw_passwd
dovrebbe essere ora impostata a una dimensione di 128; questa la query:
ALTER TABLE `vpopmail` CHANGE `pw_passwd` `pw_passwd` CHAR(128) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL;
Aggiornare dalla versione 5.6.3 alla versione 5.6.4
Varie altre modifiche che però non creano incompatibilità con le versioni precedenti sono state apportate al layout delle tabelleMySQL
. Ecco la query da lanciare per alterarle (inlclusa la modifica già menzionata sopra):/* vpopmail */
ALTER TABLE `vpopmail` CHANGE `pw_name` `pw_name` VARCHAR(64) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL;
ALTER TABLE `vpopmail` CHANGE `pw_domain` `pw_domain` VARCHAR(96) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL;
ALTER TABLE `vpopmail` CHANGE `pw_passwd` `pw_passwd` VARCHAR(128) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL;
ALTER TABLE `vpopmail` CHANGE `pw_gecos` `pw_gecos` VARCHAR(64) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL;
ALTER TABLE `vpopmail` CHANGE `pw_dir` `pw_dir` VARCHAR(160) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL;
ALTER TABLE `vpopmail` CHANGE `pw_shell` `pw_shell` VARCHAR(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL;
/* vlog */
ALTER TABLE `vlog` CHANGE `user` `user` VARCHAR(32) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL;
ALTER TABLE `vlog` CHANGE `passwd` `passwd` VARCHAR(32) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL;
ALTER TABLE `vlog` CHANGE `domain` `domain` VARCHAR(96) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL;
ALTER TABLE `vlog` CHANGE `remoteip` `remoteip` VARCHAR(39) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL;
ALTER TABLE `vlog` CHANGE `error` `error` TINYINT(1) NULL DEFAULT NULL;
ALTER TABLE `vlog` CHANGE `timestamp` `timestamp` INT NOT NULL DEFAULT '0';
/* lastauth */
ALTER TABLE `lastauth` CHANGE `user` `user` VARCHAR(32) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL;
ALTER TABLE `lastauth` CHANGE `domain` `domain` VARCHAR(96) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL;
ALTER TABLE `lastauth` CHANGE `remote_ip` `remote_ip` VARCHAR(39) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL;
ALTER TABLE `lastauth` CHANGE `timestamp` `timestamp` INT NOT NULL DEFAULT '0';
/* limits */
ALTER TABLE `limits` CHANGE `domain` `domain` VARCHAR(96) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL;
/* alias */
ALTER TABLE `valias` CHANGE `alias` `alias` VARCHAR(32) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL;
ALTER TABLE `valias` CHANGE `domain` `domain` VARCHAR(96) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL;
/* dir_control */
ALTER TABLE `dir_control` CHANGE `domain` `domain` VARCHAR(96) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL;
/* aliasdomains */
ALTER TABLE `aliasdomains` CHANGE `alias` `alias` VARCHAR(96) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL;
ALTER TABLE `aliasdomains` CHANGE `domain` `domain` VARCHAR(96) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL;
Mie modifiche al programma
Questo l'insieme delle mie patch che sono incluse in vpopmail
a partire dalla versione 5.6.0:
- la patch sql-aliasdomains, che fa in modo che VPopMail salvi gli aliasdomains su mysql. Questo consente al driver sql di dovecot di fare l'autenticazione non solo con i domini reali ma anche con gli alias, a condizione che si modifichi anche la query all'interno del driver, come verrà spiegato dopo. Ciò è ora importante, dato che dovecot ha eliminato il driver per VPopMail.
- la patch defaultdelivery (
--enable-defaultdelivery
):vdelivermail
è installato per default nel .qmail-default dei nuovi domini con l'opzione 'delete'.- se nessun utente e nessun .qmail sono stati trovati viene eseguito quanto contenuto nel file control/defaultdelivery, di modo che
dovecot-lda
possa salvare la mail ed eseguire le regole sieve. - se
vdelivermail
è stato trovato nel file control/defaultdelivery, allora control/defaultdelivery viene ignorato e la consegna del messaggio rimane a carico divdelivermail,
per evitare loop.
- dovecot-sql-procedures patch. Se si vuole usare il driver sql di
dovecot
con la configurazione "una tabella per un dominio) (--disable-many-domains
) è necessario personalizzare in modo pesante le query sql. Con questo aggiustamentovpopmail
installerà in modo autonomo la procedura e le funzioni sql nel database quando si crea un nuovo dominio. La procedura può essere chiamata dadovecot
per fare l'autenticazione.
Il codice sql supporta gli aliasdomains e i mysql limits, e sarà caricato dal file~/vpopmail/etc/disable-many-domains_procedures.sql
che si può ovviamente personalizzare.
E' necessario configurarevpopmail
con--enable-mysql-bin=PATH
poichè dobbiamo installare la procedura chiamandomysql
con un comando shell. - vusaged configure patch
Almeno su Debian 11 sembra chevusaged
si rifiuti di terminare la configurazione (comando configure) a causa di un mancato link alle libreriemysql
(configure: error: No vauth_getpw in libvpopmail). Ovviamente ho spulciato lo script e il link sembra impostato correttamente, e ciò è al momento molto strano. Dopo un po' di prove, ho notato che facendo in modo che il configure superi il problema senza bloccarsi con un messaggio di errore, la compilazione susseguente vada a buon fine linkando corrrettamentelibmysqlclient
e terminando con successo la compilazione.
NB: è necessario dare unautoreconf -f -i
nella directoryvusaged
prima della configurazione, dal momento che il fileconfigure.ac
è stato modificato. - s/qmail cdb patch. Questa patch, che consente a
vpopmail
di localizzare correttamente il file assign.cdb diqmail
per gli utentis/qmail
, nell'attuale pacchetto perchè rimpiazzata da una analoga. Gli utenti dis/qmail
dovrebbero configurarevpopmail
con l'opzione--enable-qmail-cdb-name=assign.cdb
- recipient check patch. Da usare con s/qmail di Erwin Hoffmann al fine di validare il destinatario della mail. Questa patch non è importante nella presente installazione. Si veda il file doc/README.vrcptcheck per maggiori informazioni.
- vuserinfo-D_newline, una piccola patch che migliora la leggibilità quando si utilizza il comando
vuserinfo -D
, introducendo una nuova linea - la patch gcc-10-compat, con il la quale VPopMail è compatibile con
gcc-10
. - Una patch che risolve i seguenti problemi (Ali Erturk TURKER):
- vdelivermail.c controlla i permessi di spamassassin anzichè di maildrop.
- vopen_smtp_relay() restituisce il valore corretto, di modo che open_smtp_relay() possa rilevare e riportare gli errori di connessione al database (vmysql.c, voracle.pc, vpgsql.c)
- vdel_limits() esegue un core-dump se la connessione al database non è disponibile. (vmysql.c, voracle.pc)
qmail - basic setup
19 agosto 2025 by Roberto Puzzanghera 30 commenti
Changelog
- 19 agosto 2025
- netqmail-1.07.1 ora compila con gcc 15.2 - 10 febbraio 2025
- i sorgenti dinetqmail
sono ora compatibili con le nuove versioni digcc
eclang
.
- rinominati comenetqmail-1.07
i vecchi sorgenti di netqmail
Spamassassin TxRep Reputation plugin e filtro Bayesiano (SQL)
18 agosto 2025 by Roberto Puzzanghera 0 commenti
TxRep was designed as an enhanced replacement of the AutoWhitelist plugin. TxRep, just like AWL, tracks scores of messages previously received, and adjusts the current message score, either by boosting messages from senders who send ham or penalizing senders who have sent spam previously. This not only treats some senders as if they were whitelisted but also treats spammers as if they were blacklisted. Each message from a particular sender adjusts the historical total score which can change them from a spammer if they send non-spam messages. Senders who are considered non-spammers can become treated as spammers if they send messages which appear to be spam. Simpler told TxRep is a score averaging system. It keeps track of the historical average of a sender, and pushes any subsequent mail towards that average.
The Bayesian classifier in Spamassassin tries to identify spam by looking at what are called tokens; words or short character sequences that are commonly found in spam or ham. If I've handed 100 messages to sa-learn that have the phrase penis enlargement and told it that those are all spam, when the 101st message comes in with the words penis and enlargment, the Bayesian classifier will be pretty sure that the new message is spam and will increase the spam score of that message.
In pratica Bayes
è un classificatore statistico: guarda i token (parole, header, URL, ecc.) e calcola la probabilità che il messaggio sia spam senza interessarsi di chi manda, ma solo del contenuto.
Invece TxRep
tiene traccia della reputazione del mittente (indirizzo email + IP).
Changelog
- 18 agosto 2025: aggiunte parecchie informazioni alla sezione "Addestramento del sistema bayesiano"
Converting a Linux installation to a Slackware one in an OVHcloud server
17 giugno 2025 by Roberto Puzzanghera 0 commenti
This article explains how to convert a given Linux distribution to a Slackware
one in an OVHcloud server. I wrote in the past an article about doing the same for OVH kimsufi.
It is inspired by the Slackware
wiki page Install Slackware on an online.net Dedibox BareMetal Server, which explains the same for a Dedibox BareMetal Server on online.net.
The plan is to
- install a
Linux
of your choice - reboot in rescue mode that
Linux
distro - download the
Slackware
initrd and prepare the install environment - download the set of
Slackware
packages to be installed - chroot into the
Slackware
initrd image - partition and install
Slackware
over the existingLinux
- configure the fresh installed
Slackware
and reboot
Limitare il numero di email inviate da un dato auth-user/domain/IP
14 giugno 2025 by Roberto Puzzanghera 0 commenti
NB se si è seguita la 'configurazione veloce' basata sullo script config-all
, questo programma è già stato configurato.
Changelog
- Jun 14, 2025
- Added a cronjob for rcptcheck-overlimit that only removes cases that didn't exceed the limit, i.e. enforces a permanent ban (tx Andreas Gerstlauer)
Se si vuole evitare il rischio di compromettere il proprio server a causa di account che inviano indiscriminatamente messaggi a tutto il mondo, ad esempio per via di di una password che è stata violata in qualche modo, si può utilizzare lo script rcptcheck-overlimit di Luca Franceschini, che deve essere usato insieme alla patch rcptcheck (una patch derivata da Luca da un lavoro originale di Jay Soffian).