Postfix Setup · 8 min read · Nov 25, 2025

Utenti e Domini Virtuali Con Postfix, Courier, MySQL E SquirrelMail (Fedora 13 x86_64) - Pagina 5

13 Installa Razor, Pyzor E DCC E Configura SpamAssassin

Razor, Pyzor e DCC sono filtri antispam che utilizzano una rete di filtraggio collaborativo. Per installare Razor e Pyzor, esegui

yum install perl-Razor-Agent pyzor

Poi inizializza entrambi i servizi:

chmod -R a+rX /usr/share/doc/pyzor-0.5.0 /usr/bin/pyzor /usr/bin/pyzord  
chmod -R a+rX /usr/lib/python2.6/site-packages/pyzor  
su -m amavis -c 'pyzor --homedir /var/spool/amavisd discover'  
su -m amavis -c 'razor-admin -home=/var/spool/amavisd -create'  
su -m amavis -c 'razor-admin -home=/var/spool/amavisd -register'

Poi installiamo DCC come segue:

cd /tmp  
wget http://www.dcc-servers.net/dcc/source/dcc-dccproc.tar.Z  
tar xzvf dcc-dccproc.tar.Z  
cd dcc-dccproc-1.3.126  
./configure --with-uid=amavis  
make  
make install  
chown -R amavis:amavis /var/dcc  
ln -s /var/dcc/libexec/dccifd /usr/local/bin/dccifd

Ora dobbiamo dire a SpamAssassin di utilizzare questi tre programmi. Modifica /etc/mail/spamassassin/local.cf in modo che appaia così:

vi /etc/mail/spamassassin/local.cf

| # Questi valori possono essere sovrascritti modificando ~/.spamassassin/user_prefs.cf # (vedi spamassassin(1) per dettagli) # Queste dovrebbero essere assunzioni sicure e consentire una semplice selezione visiva # senza rischiare di perdere email. #required_hits 5 #report_safe 0 #rewrite_header Subject [SPAM] # dcc use_dcc 1 dcc_path /usr/local/bin/dccproc #pyzor use_pyzor 1 pyzor_path /usr/bin/pyzor #razor use_razor2 1 razor_config /var/spool/amavisd/razor-agent.conf #bayes use_bayes 1 use_bayes_rules 1 bayes_auto_learn 1 |

Poi dobbiamo abilitare il plugin DCC in SpamAssassin. Apri /etc/mail/spamassassin/v310.pre e decommenta la riga loadplugin Mail::SpamAssassin::Plugin::DCC:

vi /etc/mail/spamassassin/v310.pre

| [...] # DCC - esegui controlli dei messaggi DCC. # # DCC è disabilitato qui perché non è open source. Vedi la licenza DCC # per maggiori dettagli. # loadplugin Mail::SpamAssassin::Plugin::DCC [...] |

Puoi controllare la configurazione di SpamAssassin eseguendo:

spamassassin --lint

Non dovrebbe mostrare errori.

Esegui

/etc/init.d/amavisd restart

dopo.

Ora aggiorniamo i nostri set di regole di SpamAssassin come segue:

sa-update --no-gpg

Creiamo un lavoro cron in modo che i set di regole vengano aggiornati regolarmente. Esegui

crontab -e

per aprire l’editor del lavoro cron. Crea il seguente lavoro cron:

| 23 4 */2 * * /usr/bin/sa-update --no-gpg &> /dev/null |

Questo aggiornerà i set di regole ogni secondo giorno alle 4.23h.

14 Notifiche di Superamento Quota

Se desideri ricevere notifiche su tutti gli account email che sono oltre quota, crea il file /usr/local/sbin/quota_notify:

cd /usr/local/sbin/  
vi quota_notify

| #!/usr/bin/perl -w # Autore <[email protected]> # # Questo script presume che virtual_mailbox_base sia definito # nel file main.cf di postfix. Questa directory è presunta contenere # directory che a loro volta contengono le maildir degli utenti virtuali. # Ad esempio: # # -----------/ # | # | # home/vmail/domains/ # | | # | | # example.com/ foo.com/ # | # | # ----------------- # | | | # | | | # user1/ user2/ user3/ # | # | # maildirsize # use strict; my $POSTFIX_CF = "/etc/postfix/main.cf"; my $MAILPROG = "/usr/sbin/sendmail -t"; my $WARNPERCENT = 80; my @POSTMASTERS = ('[email protected]'); my $CONAME = 'La Mia Azienda'; my $COADDR = '[email protected]'; my $SUADDR = '[email protected]'; my $MAIL_REPORT = 1; my $MAIL_WARNING = 1; #get virtual mailbox base from postfix config open(PCF, "< $POSTFIX_CF") or die $!; my $mboxBase; while () { next unless /virtual_mailbox_base\s*=\s*(.*)\s*/; $mboxBase = $1; } close(PCF); #assume one level of subdirectories for domain names my @domains; opendir(DIR, $mboxBase) or die $!; while (defined(my $name = readdir(DIR))) { next if $name =~ /^\.\.?$/; #skip '.' and '..' next unless (-d "$mboxBase/$name"); push(@domains, $name); } closedir(DIR); #iterate through domains for username/maildirsize files my @users; chdir($mboxBase); foreach my $domain (@domains) { opendir(DIR, $domain) or die $!; while (defined(my $name = readdir(DIR))) { next if $name =~ /^\.\.?$/; #skip '.' and '..' next unless (-d "$domain/$name"); push(@users, {"$name\@$domain" => "$mboxBase/$domain/$name"}); } } closedir(DIR); #get user quotas and percent used my (%lusers, $report); foreach my $href (@users) { foreach my $user (keys %$href) { my $quotafile = "$href->{$user}/maildirsize"; next unless (-f $quotafile); open(QF, "< $quotafile") or die $!; my ($firstln, $quota, $used); while () { my $line = $_; if (! $firstln) { $firstln = 1; die "Errore: file di quota corrotto $quotafile" unless ($line =~ /^(\\d+)S/); $quota = $1; last if (! $quota); next; } die "Errore: file di quota corrotto $quotafile" unless ($line =~ /\s*(-?\d+)/); $used += $1; } close(QF); next if (! $used); my $percent = int($used / $quota * 100); $lusers{$user} = $percent unless not $percent; } } #send a report to the postmasters if ($MAIL_REPORT) { open(MAIL, "| $MAILPROG"); select(MAIL); map {print "To: $_\n"} @POSTMASTERS; print "From: $COADDR\n"; print "Subject: Rapporto Quotidiano sulla Quota.\n"; print "RAPPORTO QUOTIDIANO SULLA QUOTA:\n\n"; print "----------------------------------------------\n"; print "| % UTILIZZO | NOME ACCOUNT |\n"; print "----------------------------------------------\n"; foreach my $luser ( sort { $lusers{$b} <=> $lusers{$a} } keys %lusers ) { printf("| %3d | %32s |\n", $lusers{$luser}, $luser); print "---------------------------------------------\n"; } print "\n--\n"; print "$CONAME\n"; close(MAIL); } #email a warning to people over quota if ($MAIL_WARNING) { foreach my $luser (keys (%lusers)) { next unless $lusers{$luser} >= $WARNPERCENT; # skip those under quota open(MAIL, "| $MAILPROG"); select(MAIL); print "To: $luser\n"; map {print "BCC: $_\n"} @POSTMASTERS; print "From: $SUADDR\n"; print "Subject: AVVISO: La tua casella è piena al $lusers{$luser}%.\n"; print "Reply-to: $SUADDR\n"; print "La tua casella: $luser è piena al $lusers{$luser}%.\n\n"; print "Una volta che la tua casella di posta ha superato la tua quota di archiviazione mensile\n"; print "la tua fatturazione mensile sarà automaticamente regolata.\n"; print "Si prega di considerare di eliminare email e svuotare la cartella della spazzatura per liberare spazio.\n\n"; print "Contattare <$SUADDR> per ulteriore assistenza.\n\n"; print "Grazie.\n\n"; print "--\n"; print "$CONAME\n"; close(MAIL); } } |

Assicurati di regolare le variabili in cima (soprattutto l’indirizzo email [email protected]).

Dobbiamo rendere il file eseguibile:

chmod 755 quota_notify

Esegui

crontab -e

per creare un lavoro cron per quello script:

| 0 0 * * * /usr/local/sbin/quota_notify &> /dev/null |

15 Testa Postfix

Per vedere se Postfix è pronto per SMTP-AUTH e TLS, esegui

telnet localhost 25

Dopo aver stabilito la connessione al tuo server di posta Postfix, digita

ehlo localhost

Se vedi le righe

*250-STARTTLS *

e

*250-AUTH* LOGIN* PLAIN** *

tutto va bene.

[root@server1 sbin]# telnet localhost 25  
Trying ::1...  
Connected to localhost.  
Escape character is '^]'.  
220 server1.example.com ESMTP Postfix  
ehlo localhost  
250-server1.example.com  
250-PIPELINING  
250-SIZE 10240000  
250-VRFY  
250-ETRN  
250-STARTTLS  
250-AUTH LOGIN PLAIN  
250-AUTH=LOGIN PLAIN  
250-ENHANCEDSTATUSCODES  
250-8BITMIME  
250 DSN  
quit  
221 2.0.0 Bye  
Connection closed by foreign host.  
[root@server1 sbin]#

Digita

quit

per tornare alla shell del sistema.

16 Popola Il Database E Testa

Per popolare il database puoi usare la shell di MySQL:

mysql -u root -p
USE mail;

Almeno devi creare voci nelle tabelle domains e users:

INSERT INTO `domains` (`domain`) VALUES ('example.com');  
INSERT INTO `users` (`email`, `password`, `quota`) VALUES ('[email protected]', ENCRYPT('secret'), 10485760);

(Per favore fai attenzione a usare la sintassi ENCRYPT nella seconda istruzione INSERT per crittografare la password!)

Se vuoi fare voci nelle altre due tabelle, potrebbe apparire così:

INSERT INTO `forwardings` (`source`, `destination`) VALUES ('[email protected]', '[email protected]');  
INSERT INTO `transport` (`domain`, `transport`) VALUES ('example.com', 'smtp:mail.example.com');

Per uscire dalla shell di MySQL, digita

quit;

Per la maggior parte delle persone è più facile avere un’interfaccia grafica per MySQL; quindi puoi anche usare phpMyAdmin (in questo esempio sotto http://192.168.0.100/phpMyAdmin/ o http://server1.example.com/phpMyAdmin/) per amministrare il database mail. Ancora una volta, quando crei un utente, assicurati di usare la funzione ENCRYPT per crittografare la password:

Non credo di dover spiegare ulteriormente le tabelle domains e users.

La tabella forwardings può avere voci come le seguenti:

sourcedestination
[email protected][email protected]Reindirizza le email per [email protected] a [email protected]
@example.com[email protected]Crea un account Catch-All per [email protected]. Tutte le email a example.com arriveranno a [email protected], tranne quelle che esistono nella tabella users (cioè, se [email protected] esiste nella tabella users, le email a [email protected] arriveranno comunque a [email protected]).
@example.com@anotherdomain.tldQuesto reindirizza tutte le email a example.com allo stesso utente su anotherdomain.tld. Ad esempio, le email a [email protected] saranno inoltrate a [email protected].
[email protected][email protected], [email protected]Inoltra le email per [email protected] a due o più indirizzi email. Tutti gli indirizzi email elencati sotto destinazione ricevono una copia dell’email.

La tabella transport può avere voci come queste:

domaintransport
example.com:Consegna le email per example.com localmente. Questo è come se questo record non esistesse affatto in questa tabella.
example.comsmtp:mail.anotherdomain.tldConsegna tutte le email per example.com tramite smtp al server mail.anotherdomain.com.
example.comsmtp:mail.anotherdomain.tld:2025Consegna tutte le email per example.com tramite smtp al server mail.anotherdomain.com, ma sulla porta 2025, non 25 che è la porta predefinita per smtp.

| example.com | smtp:[1.2.3.4]
smtp:[1.2.3.4]:2025
smtp:[mail.anotherdomain.tld] | Le parentesi quadre impediscono a Postfix di eseguire ricerche del record MX DNS per l’indirizzo tra parentesi quadre. Ha senso per gli indirizzi IP. | | .example.com | smtp:mail.anotherdomain.tld | La posta per qualsiasi sottodominio di example.com viene consegnata a mail.anotherdomain.tld. | | * | smtp:mail.anotherdomain.tld | Tutte le email vengono consegnate a mail.anotherdomain.tld. | | [email protected] | smtp:mail.anotherdomain.tld | Le email per [email protected] vengono consegnate a mail.anotherdomain.tld. |

Vedi

man transport

per maggiori dettagli.

Si prega di tenere a mente che l’ordine delle voci nella tabella transport è importante! Le voci saranno seguite dall’alto verso il basso.

Importante: Postfix utilizza un meccanismo di caching per i trasporti, quindi potrebbe volerci un po’ prima che le modifiche nella tabella transport abbiano effetto. Se vuoi che abbiano effetto immediato, esegui

postfix reload

dopo aver apportato le modifiche nella tabella transport.

17 Invia Una Email Di Benvenuto Per Creare Maildir

Quando crei un nuovo account email e provi a recuperare email da esso (con POP3/IMAP) probabilmente riceverai messaggi di errore che dicono che il Maildir non esiste. Il Maildir viene creato automaticamente quando arriva la prima email per il nuovo account. Pertanto, è una buona idea inviare un’email di benvenuto a un nuovo account.

Prima, installiamo il pacchetto mailx:

yum install mailx

Per inviare un’email di benvenuto a [email protected], facciamo così:

mailx [email protected]

Ti verrà chiesto di inserire l’oggetto. Digita l’oggetto (ad esempio Benvenuto), poi premi INVIO, e nella riga successiva digita il tuo messaggio. Quando il messaggio è finito, premi di nuovo INVIO in modo da essere in una nuova riga, poi premi CTRL+D:

[root@server1 ~]# mailx [email protected]
Subject: Benvenuto <– INVIO
Benvenuto! Divertiti con il tuo nuovo account email. <– INVIO
<– CTRL+D
EOT
[root@server1 ~]#

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.