Postfix y MySQL · 9 min read · Dec 26, 2025

Usuarios Virtuales Y Dominios Con Postfix, Courier, MySQL Y SquirrelMail (Fedora 14 x86_64) - Página 5

13 Instalar Razor, Pyzor Y DCC Y Configurar SpamAssassin

Razor, Pyzor y DCC son filtros de spam que utilizan una red de filtrado colaborativo. Para instalar Razor y Pyzor, ejecuta

yum install perl-Razor-Agent pyzor

Luego inicializa ambos servicios:

chmod -R a+rX /usr/share/doc/pyzor-0.5.0 /usr/bin/pyzor /usr/bin/pyzord  
chmod -R a+rX /usr/lib/python2.7/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'

Luego instalamos DCC de la siguiente manera:

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.134  
./configure --with-uid=amavis  
make  
make install  
chown -R amavis:amavis /var/dcc  
ln -s /var/dcc/libexec/dccifd /usr/local/bin/dccifd

Ahora tenemos que decirle a SpamAssassin que use estos tres programas. Edita /etc/mail/spamassassin/local.cf para que se vea así:

vi /etc/mail/spamassassin/local.cf

| # Estos valores pueden ser sobrescritos editando ~/.spamassassin/user_prefs.cf # (ver spamassassin(1) para más detalles) # Estas deberían ser suposiciones seguras y permitir un filtrado visual simple # sin arriesgar correos electrónicos perdidos. #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 |

Luego debemos habilitar el plugin DCC en SpamAssassin. Abre /etc/mail/spamassassin/v310.pre y descomenta la línea loadplugin Mail::SpamAssassin::Plugin::DCC:

vi /etc/mail/spamassassin/v310.pre

| [...] # DCC - realizar comprobaciones de mensajes DCC. # # DCC está deshabilitado aquí porque no es de código abierto. Ver la DCC # licencia para más detalles. # loadplugin Mail::SpamAssassin::Plugin::DCC [...] |

Puedes verificar tu configuración de SpamAssassin ejecutando:

spamassassin --lint

No debería mostrar ningún error.

Ejecuta

/etc/init.d/amavisd restart

despues.

Ahora actualizamos nuestros conjuntos de reglas de SpamAssassin de la siguiente manera:

sa-update --no-gpg

Creamos un trabajo cron para que los conjuntos de reglas se actualicen regularmente. Ejecuta

crontab -e

para abrir el editor de trabajos cron. Crea el siguiente trabajo cron:

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

Esto actualizará los conjuntos de reglas cada dos días a las 4:23h.

14 Notificaciones de Exceso de Cuota

Si deseas recibir notificaciones sobre todas las cuentas de correo electrónico que están sobre la cuota, entonces crea el archivo /usr/local/sbin/quota_notify:

cd /usr/local/sbin/  
vi quota_notify

| #!/usr/bin/perl -w # Autor <[email protected]> # # Este script asume que virtual_mailbox_base está definido # en el archivo main.cf de postfix. Este directorio se asume que contiene # directorios que a su vez contienen los maildirs de tus usuarios virtuales. # Por ejemplo: # # -----------/ # | # | # 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 = 'Mi Empresa'; 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); each 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); each 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 "Error: corrupt quotafile $quotafile" unless ($line =~ /^(\\d+)S/); $quota = $1; last if (! $quota); next; } die "Error: corrupt quotafile $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: Informe Diario de Cuota.\n"; print "INFORME DIARIO DE CUOTA:\n\n"; print "----------------------------------------------\n"; print "| % USO | NOMBRE DE CUENTA |\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: ADVERTENCIA: Su buzón está $lusers{$luser}% lleno.\n"; print "Reply-to: $SUADDR\n"; print "Su buzón: $luser está $lusers{$luser}% lleno.\n\n"; print "Una vez que su buzón de correo haya superado su cuota de almacenamiento mensual\n"; print "su facturación mensual se ajustará automáticamente.\n"; print "Por favor, considere eliminar correos electrónicos y vaciar su carpeta de basura para liberar espacio.\n\n"; print "Contacte <$SUADDR> para más asistencia.\n\n"; print "Gracias.\n\n"; print "--\n"; print "$CONAME\n"; close(MAIL); } } |

Asegúrate de ajustar las variables en la parte superior (especialmente la dirección de correo electrónico [email protected]).

Debemos hacer que el archivo sea ejecutable:

chmod 755 quota_notify

Ejecuta

crontab -e

para crear un trabajo cron para ese script:

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

15 Probar Postfix

Para ver si Postfix está listo para SMTP-AUTH y TLS, ejecuta

telnet localhost 25

Después de haber establecido la conexión con tu servidor de correo Postfix, escribe

ehlo localhost

Si ves las líneas

*250-STARTTLS *

y

*250-AUTH* LOGIN* PLAIN** *

todo está bien.

[root@server1 sbin]# telnet localhost 25  
Trying 127.0.0.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]#

Escribe

quit

para volver a la shell del sistema.

16 Población De La Base De Datos Y Prueba

Para poblar la base de datos puedes usar la consola de MySQL:

mysql -u root -p
USE mail;

Al menos debes crear entradas en las tablas domains y users:

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

(¡Por favor, asegúrate de usar la sintaxis ENCRYPT en la segunda declaración INSERT para encriptar la contraseña!)

Si deseas hacer entradas en las otras dos tablas, eso se vería así:

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

Para salir de la consola de MySQL, escribe

quit;

Para la mayoría de las personas es más fácil si tienen una interfaz gráfica para MySQL; por lo tanto, también puedes usar phpMyAdmin (en este ejemplo bajo http://192.168.0.100/phpMyAdmin/ o http://server1.example.com/phpMyAdmin/) para administrar la base de datos mail. Nuevamente, cuando crees un usuario, asegúrate de usar la función ENCRYPT para encriptar la contraseña:

No creo que tenga que explicar más la tabla de dominios y usuarios.

La tabla de reenvíos puede tener entradas como las siguientes:

sourcedestination
[email protected][email protected]Redirige correos electrónicos para [email protected] a [email protected]
@example.com[email protected]Crea una cuenta Catch-All para [email protected]. Todos los correos electrónicos a example.com llegarán a [email protected], excepto aquellos que existan en la tabla de usuarios (es decir, si [email protected] existe en la tabla de usuarios, los correos a [email protected] aún llegarán a [email protected]).
@example.com@anotherdomain.tldEsto redirige todos los correos electrónicos a example.com al mismo usuario en anotherdomain.tld. Por ejemplo, los correos a [email protected] serán reenviados a [email protected].
[email protected][email protected], [email protected]Reenvía correos electrónicos para [email protected] a dos o más direcciones de correo electrónico. Todas las direcciones de correo electrónico listadas bajo el destino reciben una copia del correo electrónico.

La tabla de transporte puede tener entradas como estas:

domaintransport
example.com:Entrega correos electrónicos para example.com localmente. Esto es como si este registro no existiera en esta tabla en absoluto.
example.comsmtp:mail.anotherdomain.tldEntrega todos los correos electrónicos para example.com a través de smtp al servidor mail.anotherdomain.com.
example.comsmtp:mail.anotherdomain.tld:2025Entrega todos los correos electrónicos para example.com a través de smtp al servidor mail.anotherdomain.com, pero en el puerto 2025, no en el 25 que es el puerto predeterminado para smtp.

| example.com | smtp:[1.2.3.4]
smtp:[1.2.3.4]:2025
smtp:[mail.anotherdomain.tld] | Los corchetes evitan que Postfix realice búsquedas del registro MX DNS para la dirección entre corchetes. Tiene sentido para direcciones IP. | | .example.com | smtp:mail.anotherdomain.tld | El correo para cualquier subdominio de example.com se entrega a mail.anotherdomain.tld. | | * | smtp:mail.anotherdomain.tld | Todos los correos electrónicos se entregan a mail.anotherdomain.tld. | | [email protected] | smtp:mail.anotherdomain.tld | Los correos para [email protected] se entregan a mail.anotherdomain.tld. |

Consulta

man transport

para más detalles.

Ten en cuenta que el orden de las entradas en la tabla de transporte es importante. Las entradas se seguirán de arriba hacia abajo.

Importante: Postfix utiliza un mecanismo de caché para los transportes, por lo tanto, puede tardar un tiempo hasta que los cambios en la tabla de transporte surtan efecto. Si deseas que surtan efecto de inmediato, ejecuta

postfix reload

despues de haber realizado tus cambios en la tabla de transporte.

17 Enviar Un Correo Electrónico De Bienvenida Para Crear Maildir

Cuando creas una nueva cuenta de correo electrónico y tratas de obtener correos de ella (con POP3/IMAP) probablemente recibirás mensajes de error diciendo que el Maildir no existe. El Maildir se crea automáticamente cuando llega el primer correo electrónico para la nueva cuenta. Por lo tanto, es una buena idea enviar un correo electrónico de bienvenida a una nueva cuenta.

Primero, instalamos el paquete mailx:

yum install mailx

Para enviar un correo electrónico de bienvenida a [email protected], hacemos esto:

mailx [email protected]

Se te pedirá que ingreses el asunto. Escribe el asunto (por ejemplo, Bienvenido), luego presiona ENTER, y en la siguiente línea escribe tu mensaje. Cuando el mensaje esté terminado, presiona ENTER nuevamente para que estés en una nueva línea, luego presiona CTRL+D:

[root@server1 ~]# mailx [email protected]
Subject: Bienvenido <– ENTER
¡Bienvenido! Diviértete con tu nueva cuenta de correo. <– ENTER
<– CTRL+D
EOT
[root@server1 ~]#

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.