Montar un servidor de correo con Postfix, Dovecot y DSPAM
Notas preliminares
Sistema Operativo: Debian estable.
Servicios:
- Postfix (SMTP)
- Dovecot (IMAP/POP3)
- MySQL (autentificación)
- DSPAM (anti-spam)
Proceso de instalación
MySQL
Vamos a utilizar la siguiente estructura de base de datos:
-
-
Para crear una cuenta de correo nueva es necesario realizar los siguientes pasos:
- Crear el maildir del usuario usando el comando
maildirmake.dovecot
- Asignar el usuario del sistema usado para los servicios de correo como propietario del maildir.
- Añadir el usuario a la tabla de usuarios en el MySQL
Dovecot
Instalamos el servidor:
$ apt-get install dovecot-imapd dovecot-pop3d
Editamos el fichero /etc/dovecot/dovecot.conf
:
protocols = imap pop3
listen = *
disable_plaintext_auth = no
login_greeting_capability = yes
log_path = /var/log/mail.log
info_log_path = /var/log/mail.info
log_timestamp = "%Y-%m-%d %H:%M:%S "
# Esta opción especifica el lugar donde se encuentra
# el directorio de correo del usuario. Está establecido
# de forma que la ruta del maildir del usuario se obtiene
# en la consulta SQL, en el campo userdb_home.
mail_location = maildir:%h
mail_extra_groups = mail
protocol imap {
# Activamos esta opción para solucionar problemas con
# Outlook Express.
imap_client_workarounds = outlook-idle
mail_plugins = quota imap_quota
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
# Activamos esta opción para solucionar problemas con
# Outlook Express.
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
mail_plugins = quota
}
auth default {
mechanisms = plain login digest-md5 cram-md5
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
# Activando esta opción sólo es necesaria una consulta
# SQL para autentificar al usuario y obtener los datos
# del mismo.
userdb prefetch {
}
user = root
# Esta opción abre un socket que Postfix utilizará para
# la autentificación SMTP.
socket listen {
master {
path = /var/spool/postfix/private/auth-master
mode = 0600
user = postfix
group = postfix
}
client {
path = /var/spool/postfix/private/auth-client
mode = 0660
user = postfix
group = postfix
}
}
}
dict {
}
plugin {
}
Editamos el fichero /etc/dovecot/dovecot-sql.conf
:
driver = mysql
connect = dbname=maildb host=localhost user=usermail password=passwordmail
# Esta opción especifica qué tipo de huella contiene el campo crypt.
# En nuestro caso es el valor del campo clear pasado a la función MD5().
default_pass_scheme = PLAIN-MD5
password_query = SELECT id AS user, crypt AS password,
CONCAT(home, '/', maildir) AS userdb_home, uid AS userdb_uid,
gid AS userdb_gid, CONCAT('maildir:storage=', FLOOR(quota / 1024)) AS userdb_quota
FROM users WHERE id = '%u' OR id2 = '%u'
Nos aseguramos de que los campos uid y gid de la tabla de usuarios coinciden con el usuario y grupo propietarios de los directorios del correo. Dovecot se cambiará a ese usuario y grupo cuando tenga que acceder al maildir de ese usuario.
Por último, reiniciamos Dovecot:
$ invoke-rc.d dovecot restart
Postfix
Instalamos el servidor, aplicándole de paso el parche para cuotas:
$ apt-get install build-essential dpkg-dev fakeroot debhelper
$ apt-get build-dep postfix
$ cd /usr/src
$ apt-get source postfix
$ wget http://vda.sourceforge.net/VDA/postfix-2.3.8-vda.patch.gz
$ gunzip postfix-2.3.8-vda.patch.gz
$ patch -p0 < postfix-2.3.8-vda.patch
$ cd postfix-2.3.8
$ dpkg-buildpackage
$ cd ..
$ dpkg -i postfix_2.3.8-2_i386.deb
$ dpkg -i postfix-mysql_2.3.8-2_i386.deb
$ dpkg -i postfix-pcre_2.3.8-2_i386.deb
Editamos el fichero /etc/postfix/main.cf
:
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
myhostname = example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost
mynetworks = 127.0.0.0/8, 192.168.0.0/16, 172.16.138.0/24
mailbox_command =
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = no
smtpd_recipient_restrictions =
reject_unauth_pipelining,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
warn_if_reject,
reject_non_fqdn_sender,
reject_invalid_hostname,
reject_rbl_client list.dsbl.org,
reject_rbl_client sbl-xbl.spamhaus.org,
permit
# Estas dos opciones configuran Postfix de forma que la
# autentificación se realiza a través del Dovecot, mediante
# el socket que éste crea.
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth-client
home_mailbox = Maildir/
disable_dns_lookups = no
delay_warning_time = 4h
unknown_local_recipient_reject_code = 450
# Opciones para la conexión con MySQL
virtual_mailbox_base = /mail
virtual_mailbox_maps = mysql:/etc/postfix/mysql_mailbox.cf
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_quotas.cf
virtual_mailbox_limit_override = yes
virtual_mailbox_limit_inbox = yes
virtual_maildir_extended = yes
virtual_create_maildirsize = yes
virtual_maildir_limit_message = "La cuenta del destinatario está llena."
virtual_overquota_bounce = yes
virtual_uid_maps = mysql:/etc/postfix/mysql_uid.cf
virtual_gid_maps = mysql:/etc/postfix/mysql_gid.cf
virtual_alias_maps = mysql:/etc/postfix/mysql_alias.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_domains.cf
Editamos los ficheros de configuración para conectar Postfix con MySQL:
# /etc/postfix/mysql_alias.cf
hosts=127.0.0.1
user=usermail
password=passwordmail
dbname=maildb
query=SELECT destination FROM aliases WHERE mail='%s' AND enabled='1'
# /etc/postfix/mysql_domains.cf
hosts=127.0.0.1
user=usermail
password=passwordmail
dbname=maildb
query=SELECT domain FROM domains WHERE domain='%s' AND enabled='1'
# /etc/postfix/mysql_gid.cf
hosts=127.0.0.1
user=usermail
password=passwordmail
dbname=maildb
query=SELECT gid FROM users WHERE id='%s' OR id2='%s'
# /etc/postfix/mysql_mailbox.cf
hosts=127.0.0.1
user=usermail
password=passwordmail
dbname=maildb
query=SELECT maildir FROM users WHERE id='%s' OR id2='%s'
# /etc/postfix/mysql_uid.cf
hosts=127.0.0.1
user=usermail
password=passwordmail
dbname=maildb
query=SELECT uid FROM users WHERE id='%s' OR id2='%s'
# /etc/postfix/mysql_quotas.cf
hosts=127.0.0.1
user=usermail
password=passwordmail
dbname=maildb
query=SELECT quotas FROM users WHERE id='%s' OR id2='%s'
Por último, reiniciamos Postfix:
$ invoke-rc.d postfix restart
DSPAM
La distribución estable de Debian no tiene los paquetes de DSPAM, sino que deben instalarse desde los backports. En el siguiente enlace se dan instrucciones para agregar los backports al gestor de paquetes:
http://backports-master.debian.org/Instructions/
Instalamos los paquetes necesarios:
$ apt-get install dspam libdspam7-drv-mysql postfix-pcre
Editar el fichero /etc/dspam/dspam.conf
:
Home /var/spool/dspam
StorageDriver /usr/lib/dspam/libmysql_drv.so
DeliveryHost 127.0.0.1
DeliveryPort 10026
DeliveryIdent localhost
DeliveryProto SMTP
OnFail error
Trust root
Trust dspam
Trust mail
Trust postfix
Trust www
#Debug *
TrainingMode teft
TestConditionalTraining on
Feature chained
Feature whitelist
Algorithm graham burton
PValue graham
Preference "spamAction=tag"
Preference "signatureLocation=headers" # 'message' or 'headers'
Preference "showFactors=on"
Preference "spamSubject=[SPAM]"
AllowOverride trainingMode
AllowOverride spamAction spamSubject
AllowOverride statisticalSedation
AllowOverride enableBNR
AllowOverride enableWhitelist
AllowOverride signatureLocation
AllowOverride showFactors
AllowOverride optIn optOut
AllowOverride whitelistThreshold
Notifications off
PurgeSignatures 14 # Stale signatures
PurgeNeutral 90 # Tokens with neutralish probabilities
PurgeUnused 90 # Unused tokens
PurgeHapaxes 30 # Tokens with less than 5 hits (hapaxes)
PurgeHits1S 15 # Tokens with only 1 spam hit
PurgeHits1I 15 # Tokens with only 1 innocent hit
LocalMX 127.0.0.1
SystemLog on
UserLog on
#Opt in
ProcessorBias on
ParseToHeaders on
ChangeModeOnParse on
ChangeUserOnParse full
ServerPID /var/run/dspam.pid
ServerParameters "--deliver=innocent,spam"
ServerIdent "localhost"
Include /etc/dspam/dspam.d/
Editar el fichero /etc/dspam/dspam.d/mysql.conf
:
MySQLServer 127.0.0.1
MySQLUser libdspam7-drv-my
MySQLPass password-de-mysql
MySQLDb libdspam7drvmysql
Editar el fichero /etc/dspam/default.prefs
:
trainingMode=TEFT
spamAction=tag
spamSubject=[SPAM]
enableBNR=on
enableWhitelist=on
statisticalSedation=5
signatureLocation=message
whitelistThreshold=10
showFactors=on
Agregar las siguientes líneas al fichero /etc/postfix/master.cf
:
- dspam unix - n n - 10 pipe
- flags=Ru user=dspam argv=/usr/bin/dspam --deliver=innocent,spam --user ${recipient} -i -f $sender -- $recipient
-
- localhost:10026 inet n - n - - smtpd
- -o content_filter=
- -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
- -o smtpd_helo_restrictions=
- -o smtpd_client_restrictions=
- -o smtpd_sender_restrictions=
- -o smtpd_recipient_restrictions=permit_mynetworks,reject
- -o mynetworks=127.0.0.0/8
- -o smtpd_authorized_xforward_hosts=127.0.0.0/8
Crear el fichero /etc/postfix/dspam_client_access
:
/./ FILTER dspam:dspam
Ejecutar la siguiente orden para generar el filtro:
$ postmap /etc/postfix/dspam_client_access
Aplicar el siguiente parche al fichero /etc/postfix/main.cf
:
- --- main.cf.pre-dspam 2007-12-12 13:10:18.000000000 +0100
- +++ main.cf 2007-12-12 13:10:00.000000000 +0100
- @@ -26,7 +26,7 @@
- reject_invalid_hostname,
- reject_rbl_client list.dsbl.org,
- reject_rbl_client sbl-xbl.spamhaus.org,
- - permit
- + check_client_access pcre:/etc/postfix/dspam_client_access
-
- # Estas dos opciones configuran Postfix de forma que la
- # autentificación se realiza a través del Dovecot, mediante
- @@ -46,3 +46,4 @@
- virtual_gid_maps = mysql:/etc/postfix/mysql_gid.cf
- virtual_alias_maps = mysql:/etc/postfix/mysql_alias.cf
- virtual_mailbox_domains = mysql:/etc/postfix/mysql_domains.cf
- +dspam_destination_recipient_limit = 1
Lo siguiente es entrenar a DSPAM. Para ello vamos a utilizar ficheros de corpus que pasaremos por el DSPAM para que los aprenda.
Lo primero que debemos hacer es crear un grupo global en el DSPAM, de forma que enviemos a ese grupo todos los mensajes del corpus y así tener una base para todos los usuarios.
Para crear un grupo de clasificación global en el DSPAM editamos el fichero
/var/spool/dspam/group
:
global:merged:*
Una vez creado el fichero, reiniciamos DSPAM:
$ invoke-rc.d dspam restart
Y ya podemos empezar a entrenarlo con los corpus.
Los corpus son conjuntos de miles de mensajes recopilados para entrenar filtros antispam. Vamos a utilizar los que hay en la página de SpamAssassin:
http://spamassassin.apache.org/publiccorpus/
En esa página hay varios ficheros de spam y de ham. Vamos a coger dos de spam y dos de ham, lo más actuales posible.
Ahora extraemos un fichero de spam y otro de ham, y nos aseguramos de que se extraen en los directorios spam y ham respectivamente. Si el tar crea un directorio que se llame distinto lo renombramos y listo. Vamos a usar los ficheros de spam y ham uno por uno: sacamos uno de spam y uno de ham, los entrenamos y luego sacamos los otros dos.
Además de los ficheros de corpus, sería conveniente entrenar como ham todos los mensajes de una cuenta de correo existente que sepamos que está totalmente limpia de spam, para así alimentar el filtro con mensajes en español además de en inglés.
Para el proceso de entrenamiento y posterior afinación del DSPAM, vamos a crear un script que recogerá un fichero de mensaje como parámetro y lo entrenará como spam o como ham según le digamos:
- #!/bin/sh
-
- if [ "$2" == "" ]; then
- exit 1
- fi
-
- CMD="$1"
- MSG="$2"
-
- if [ "$CMD" != "spam" ] && [ "$CMD" != "innocent" ]; then
- echo "$0: Error: el mensaje debe aprenderse como spam o como innocent." >&2
- exit 1
- fi
-
- echo -n "Entrenando mensaje $MSG..."
- dspam --mode=teft --source=corpus --class=$CMD --feature=chained,noise --user global < "$MSG"
- echo " hecho."
Ahora vamos a pasarle todos los mensajes al script para que los aprenda:
$ find /ruta/al/ham/ -name "*" ! -type d -exec \
> /ruta/al/dspam_corpus innocent '{}' \;
$ find /ruta/al/spam/ -name "*" ! -type d -exec \
> /ruta/al/dspam_corpus spam '{}' \;
Y ya sólo queda montar alguna forma de que los usuarios puedan realimentar mensajes que hayan sido marcados incorrectamente hacia el DSPAM. Para ello vamos a crear dos carpetas IMAP en todas las cuentas de correo y suscribiremos automáticamente a todas ellas a esas dos carpetas. Para crear automáticamente las carpetas de spam en todas las cuentas podemos usar el siguiente script:
- #!/bin/sh
-
- PATH=/bin:/sbin:/usr/bin:/usr/sbin
-
- MAIL_PATH=/mail/
-
- SPAM_FOLDER=".Marcar Como SPAM"
- HAM_FOLDER=".Marcar Como NO SPAM"
-
- MAIL_USER=correo
- MAIL_GROUP=mail
-
- find ${MAIL_PATH} -mindepth 2 -maxdepth 2 -type d -exec sh -c " \
- test -d \"{}/${SPAM_FOLDER}\" || ( echo -n 'Creando carpeta de SPAM en {}...' && \
- maildirmake.dovecot \"{}/${SPAM_FOLDER}\" && \
- chown -R ${MAIL_USER}.${MAIL_GROUP} \"{}/${SPAM_FOLDER}\" && echo ' hecho.' ); \
- test -d \"{}/${HAM_FOLDER}\" || ( echo -n 'Creando carpeta de NO SPAM en {}...' && \
- maildirmake.dovecot \"{}/${HAM_FOLDER}\" && \
- chown -R ${MAIL_USER}.${MAIL_GROUP} \"{}/${HAM_FOLDER}\" && echo ' hecho.' ); \
- " \;
Luego estableceremos una tarea programada en el crontab para entrenar todos los mensajes que hayan sido copiados a esas carpetas, usando dos scripts para realizar el proceso de clasificación y advertencia a cada usuario en caso de que se intente reentrenar un mensaje que ha sido correctamente marcado. Este es el primero:
- #!/bin/sh
-
- if [ "$2" == "" ]; then
- exit 1
- fi
-
- CMD="$1"
- MSG="$2"
- DSPAM_USER="$(dirname "$MSG" | cut -d'/' -f4)@$(dirname "$MSG" | cut -d'/' -f3)"
-
- if [ "$CMD" != "spam" ] && [ "$CMD" != "innocent" ]; then
- echo "$0: Error: el mensaje debe aprenderse como spam o como innocent." >&2
- exit 1
- fi
-
- if [ "$CMD" = "spam" ] && grep "X-DSPAM-Result: Spam" "$MSG"; then
- echo "El usuario $DSPAM_USER ha intentado reentrenar como spam un mensaje que ya ha sido marcado como spam." >&2
- if [ -f "$SPAM_WARNING" ]; then
- (grep "$DSPAM_USER" "$SPAM_WARNING" > /dev/null 2>&1) || (echo "$DSPAM_USER" >> "$SPAM_WARNING")
- fi
- exit 0
- fi
-
- if [ "$CMD" = "innocent" ] && grep "X-DSPAM-Result: Innocent" "$MSG"; then
- echo "El usuario $DSPAM_USER ha intentado reentrenar como inocente un mensaje que ya ha sido marcado como inocente." >&2
- if [ -f "$HAM_WARNING" ]; then
- (grep "$DSPAM_USER" "$HAM_WARNING" > /dev/null 2>&1) || (echo "$DSPAM_USER" >> "$HAM_WARNING")
- fi
- exit 0
- fi
-
- echo -n "Entrenando mensaje $MSG..."
- dspam --mode=toe --source=error --class=$CMD --user "$DSPAM_USER" < "$MSG"
- echo " hecho."
- exit 0
Y este el segundo:
- #!/bin/sh
-
- PATH=/bin:/sbin:/usr/bin:/usr/sbin
-
- MAIL_PATH=/mail/
-
- SPAM_FOLDER=".Marcar Como SPAM"
- HAM_FOLDER=".Marcar Como NO SPAM"
-
- SPAM_RETRAIN_PATH="/home/usuario/spam-errors/marcar-como-spam/"
- HAM_RETRAIN_PATH="/home/usuario/spam-errors/marcar-como-ham/"
-
- LEARN_COMMAND="/home/usuario/script/dspam_learn"
-
- SPAM_TYPE=spam
- HAM_TYPE=innocent
-
- # Esta medida es necesaria para avisar a aquellos usuarios que echen a reentrenar
- # mensajes que ya hayan sido correctamente marcados.
- WARNING_FROM="DSPAM.no-responder@example.com"
-
- export SPAM_WARNING=$(mktemp -t dspam_warning.spam.XXXXXXXX)
- export HAM_WARNING=$(mktemp -t dspam_warning.ham.XXXXXXXX)
-
- find ${MAIL_PATH} ! -type d -wholename "*/${SPAM_FOLDER}/*/*" -exec sh -c " \
- ${LEARN_COMMAND} ${SPAM_TYPE} '{}' && \
- echo -n \"Borrando mensaje {}...\" && \
- mv '{}' "${SPAM_RETRAIN_PATH}" && \
- echo \" hecho.\" \
- " \;
- find ${MAIL_PATH} ! -type d -wholename "*/${HAM_FOLDER}/*/*" -exec sh -c " \
- ${LEARN_COMMAND} ${HAM_TYPE} '{}' && \
- echo -n \"Borrando mensaje {}...\" && \
- mv '{}' "${HAM_RETRAIN_PATH}" && \
- echo \" hecho.\" \
- " \;
-
- # Ahora advertimos a los usuarios que hayan enviado a reentrenar mensajes
- # bien marcados.
- for i in $(cat "$SPAM_WARNING"); do
- cat <<EOF | sendmail -f "sysadmin@example.com" "$i"
- From: "Sistema antispam" <$WARNING_FROM>
- Subject: Advertencia sobre la realimentación de SPAM al sistema
-
- ESTE ES UN MENSAJE AUTOMÁTICO Y NO DEBE RESPONDER A ÉL.
-
- El sistema antispam ha detectado que usted está intentando marcar como
- SPAM mensajes que ya han sido marcados como tal por el sistema.
-
- Los mensajes marcados como SPAM son fácilmente identificables porque
- el sistema les añade el texto [SPAM] delante del asunto. Esos
- mensajes ya han sido identificados por el sistema y no es necesario
- que los realimente para que éste aprenda que son SPAM.
-
- Es posible que su error se deba a que usted está confuso respecto a
- la función del sistema antispam. Dicho sistema no elimina los mensajes
- marcados como SPAM: eso supondría violar la reglamentación sobre
- protección de datos si por cualquier motivo el sistema identificara
- como SPAM un mensaje que no lo es.
-
- El cometido del sistema antispam es el de ayudarle a marcar los
- mensajes identificados como SPAM de forma que usted, en su cliente de
- correo, pueda establecer las reglas pertinentes para mover todos esos
- mensajes a una carpeta determinada o borrarlos directamente si así lo
- desea. El propósito de la carpeta "Marcar Como SPAM" es el de ayudar
- al filtro antispam a aprender mensajes que no conozca previamente,
- afinando así su precisión al identificarlos.
-
- EOF
- done
- rm "$SPAM_WARNING"
- unset SPAM_WARNING
-
- for i in $(cat "$HAM_WARNING"); do
- cat <<EOF | sendmail -f "sysadmin@example.com" "$i"
- From: "Sistema antispam" <$WARNING_FROM>
- Subject: Advertencia sobre la realimentación de mensajes inocentes
-
- ESTE ES UN MENSAJE AUTOMÁTICO Y NO DEBE RESPONDER A ÉL.
-
- El sistema antispam ha detectado que usted está intentando marcar como
- inocentes mensajes que ya han sido marcados como tal por el sistema.
-
- Al contrario que en los mensajes marcados como SPAM, en los que el
- sistema agrega el texto [SPAM] delante del asunto, los mensajes que el
- sistema considera inocentes no sufren ese cambio. Así pues, aquellos
- mensajes que no tengan el texto [SPAM] en el asunto ya han sido
- identificados por el sistema como mensajes inofensivos y no es
- necesario que los realimente para que éste aprenda que lo son.
-
- El propósito de la carpeta "Marcar Como NO SPAM" es el de corregir
- al filtro antispam cuando identifique como SPAM un mensaje que no lo
- es, evitando así que vuelva a incurrir en el mismo error.
-
- EOF
- done
- rm "$HAM_WARNING"
- unset HAM_WARNING
Y, por último, esto es lo que introducimos en el crontab para realizar el reentrenamiento, basándonos en las gráficas de entradas al correo para tomar las horas en las que hay poca actividad y por tanto es más seguro el realizar el proceso:
- # Hacemos que se reentrene el DSPAM cuatro veces al día, a horas que
- # sabemos que hay poca actividad: las seis y las once de la mañana,
- # las tres de la tarde y las nueve de la noche.
- 0 6,11,15,21 * * * /home/usuario/script/dspam_learn_all
Scripts de ayuda
Para crear cuentas de correo nuevas
El proceso de creación de cuentas de correo se puede automatizar con el siguiente script:
- #!/bin/bash
-
- DBUSER=usermail
- DBPASS=passwordmail
- DBDATABASE=maildb
-
- MAILROOT=/mail
-
- MAILUSER=correo
- MAILGROUP=mail
-
- if [ $# == 1 ]; then
- CUENTA="$1"
- if echo "$CUENTA" | grep "@" > /dev/null 2>&1; then
- USER="$(echo "$CUENTA" | cut -d"@" -f1)"
- DOMAIN="$(echo "$CUENTA" | cut -d"@" -f2)"
- else
- USER="$CUENTA"
- read -p "Dominio: " DOMAIN
- fi
- else
- read -p "Usuario o cuenta de correo: " USER
- if echo "$USER" | grep "@" > /dev/null 2>&1; then
- CUENTA="$USER"
- USER="$(echo "$CUENTA" | cut -d"@" -f1)"
- DOMAIN="$(echo "$CUENTA" | cut -d"@" -f2)"
- else
- read -p "Dominio: " DOMAIN
- fi
- fi
-
- CHECK_ADDRESS="$(mysql -u $DBUSER -e "SELECT id FROM users WHERE id = '$USER@$DOMAIN'" $DBDATABASE -p$DBPASS)"
-
- if [[ "$CHECK_ADDRESS" != "" ]]; then
- echo ''
- echo "La dirección $USER@$DOMAIN ya existe."
- exit 1
- fi
-
- read -p "Password para la cuenta $USER@$DOMAIN: " PASSWORD
-
- DOMAINROOT=$MAILROOT/$DOMAIN
- USERDIR=$DOMAINROOT/$USER
-
- CHECK_DOMAIN="$(mysql -u $DBUSER -e "SELECT domain FROM domains WHERE domain = '$DOMAIN'" $DBDATABASE -p$DBPASS)"
-
- if [[ "$CHECK_DOMAIN" == "" ]]; then
- echo ''
- echo "El dominio $DOMAIN aún no está dado de alta en la base de datos."
- echo -n "Agregando el dominio $DOMAIN a la tabla de dominios... "
- mysql -u $DBUSER -e "INSERT INTO domains (domain) VALUES ('$DOMAIN')" $DBDATABASE -p$DBPASS && echo "hecho."
- fi
-
- if [ ! -d $DOMAINROOT ]; then
- echo ''
- echo "El directorio correspondiente al dominio $DOMAIN aún no existe."
- echo -n "Creando directorio $DOMAINROOT... "
- mkdir -p $DOMAINROOT && \
- chown $MAILUSER.$MAILGROUP "$DOMAINROOT" && \
- echo "hecho."
- fi
-
- echo ''
- echo -n "Creando buzón de correo para la cuenta $USER@$DOMAIN... "
- maildirmake.dovecot "$USERDIR"
- maildirmake.dovecot "$USERDIR/.Sent"
- maildirmake.dovecot "$USERDIR/.Trash"
- maildirmake.dovecot "$USERDIR/.Drafts"
- maildirmake.dovecot "$USERDIR/.Marcar Como SPAM"
- maildirmake.dovecot "$USERDIR/.Marcar Como NO SPAM"
- cat <<EOF > "$USERDIR/subscriptions"
- Sent
- Trash
- Drafts
- Marcar Como SPAM
- Marcar Como NO SPAM
- EOF
- chown -R $MAILUSER.$MAILGROUP "$USERDIR"
- cat <<EOF | mysql -u $DBUSER -p$DBPASS $DBDATABASE
- INSERT INTO users
- (
- id,
- id2,
- name,
- maildir,
- clear,
- crypt,
- domain,
- quota
- )
- VALUES
- (
- '$USER@$DOMAIN',
- '$USER.$DOMAIN',
- '$USER',
- '$DOMAIN/$USER/',
- '$PASSWORD',
- MD5('$PASSWORD'),
- '$DOMAIN',
- '0'
- );
- EOF
- echo "hecho."
-
- echo ''
- echo "Se ha terminado de crear la cuenta de correo $USER@$DOMAIN con la contraseña '$PASSWORD'."
Para consultar las contraseñas de las cuentas de correo
En el puesto del administrador se puede utilizar el siguiente script que genera una interfaz gráfica simple —usando Zenity— para consultar las contraseñas de las cuentas de correo:
- #!/bin/bash
-
- CRITERIO="$(zenity --entry --title='Contraseña de correo' --text='Introduzca la dirección de correo:')"
-
- if [[ "$CRITERIO" == "" ]]; then
- exit 1
- fi
- CRITERIO="$(echo ${CRITERIO} | tr -d \')"
- CONSULTA="SELECT IF(enabled = 1, 'TRUE', 'FALSE') AS enabled, id, clear FROM users WHERE id LIKE '${CRITERIO}' ORDER BY id"
- RESULTADO="$(echo ${CONSULTA} | mysql -h cignus -u usermail -b maildb -ppasswordmail | tail -n +2)"
- if [[ "$RESULTADO" == "" ]]; then
- zenity --error --title="Contraseña de correo" --text="No se ha encontrado el correo o ha habido un error al intentar obtener la contraseña."
- exit 1
- fi
- cat <<EOF | tr \\t ':'
- ${RESULTADO}
- EOF
- cat <<EOF | tr \\t \\n | zenity --list --title="Contraseña de correo" --text="Direcciones encontradas:" \
- --column="Activa" --column="E-mail" --column="Contraseña" --checklist --separator=":" --width=640 --height=480 > /dev/null
- ${RESULTADO}
- EOF