Este manual indica como configurar la opción de vacation en un servidor que utiliza postfixamavis
mysqlcourierimap y demás, siguiendo estos pasos se consigue de manera sencilla la configuración
de este servicio.
Esto trabaja bajo el script vacation.pl, el cual se encarga de enviar la notificaciones y guardar en la
base de datos el email a donde fue enviado la notificación, este script viene con el postfixadmin
cuando es descargado.
Quizás tengan que cambiar ciertas partes dependiendo si usan FreeBSD o Centos (directorios,
usuarios, etc) como sistema operativo, también en la base de datos del postfix tendrán que crear
ciertas tablas que no se crean cuando van a usar el postfix.
aquí el manual
$ mysql postfix
mysql> insert into transport values('vacation.domain.tld','vacation');
mysql> select * from transport;
+++
| domain | transport|
+++
| domain.tld | virtual: |
| vacation.domain.tld | vacation |
+++
Donde es domain.tld debes cambiar por el dominio que vas a usar, lo de tester puedes conservarlo.
mysql> select * from users;
++++++++
|id|login |address |password |name |home|maildir |
++++++++
|1 |tester|
[email protected]|.ieXhigkolJUU|Tester|/ |/postfix/tester/|
++++++++
mysql> update virtual set goto='
[email protected],
[email protected]'
where address='
[email protected]';
mysql> select * from virtual;
+++
| address | goto |
+++
|
[email protected] |
[email protected],
[email protected] |
+++
mysql> CREATE TABLE vacation (
email varchar(255) NOT NULL default '',
subject varchar(255) NOT NULL default '',
body text NOT NULL,
cache text NOT NULL,
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '00000000 00:00:00',
active tinyint(4) NOT NULL default '1',
PRIMARY KEY (email),
KEY email (email)
) TYPE=MyISAM COMMENT='Postfix Admin Virtual Vacation';
mysql> INSERT INTO vacation VALUES ('
[email protected]','Out Of Office',
'I will be out of the office until January, please do not hesitate to contact me
on my mobile +32 444 55 66', '','domain.tld','00000000 00:00:00',1);
mysql> quit
Ok hasta aquí toda la configuración de que usuario tenga el servicio de vacation activado atraves de la
consola del MYSQL, tambien puedes darle la potestad al propio usuario de que lo haga por medio del
postfixadmin, mas adelante se indica como se puede usar.
En este caso se esta implementando en un servidor con Centos 4.4, en caso de que se va a usar
FreeBSD lo que cambia son los comandos y directorios, ahora se ejecuta lo siguiente:
$ useradd vacation
$ groupadd vacation
$ mkdir /var/spool/vacation
Con este link se descarga el postfixadmin, puede ser descargado desde cualquier lugar que tengas
confianza o desde la misma pagina del postfixadmin.
$ wget http://high5.net/postfixadmin/download.php?file=postfixadmin2.1.0.tgz
$ tar xzf postfixadmin2.1.0.tgz
$ cp postfixadmin2.1.0/VIRTUAL_VACATION/vacation.pl /var/spool/vacation
$ chown R vacation.vacation /var/spool/vacation
Ahora se hace unos cambios en el archivo de master.cf del Postfix.
$ vi /etc/postfix/master.cf
[...]
vacation unix n n pipe
flags=Rhu user=vacation argv=/var/spool/vacation/vacation.pl
$ ### READ postfixadmin2.1.0/VIRTUAL_VACATION/INSTALL.TXT !!! ###
Con esto se hace que cada correo que reciba mail sea revisado por vacation.pl para ver si tiene
activado el servicio de Vacation.
Reiniciamos el servicio.
$ /etc/init.d/postfix restart
Stopping mail transport agent: Postfix.
Starting mail transport agent: Postfix.
$
De esta manera el usuario que se configure con el servicio vacation tendra un mensaje de respuesta,
tambien el mismo usuario puede personalisar el mensaje de ausencia ingresando al administrador web
del postfix:
http://host.dominio.com/postfixadmin/users
Aquí pueden ingresar bajo su propio usuario y contraseña, una ves dentro tienen la opción de poner el
mensaje de ausente, cambiar la contraseña de correo y si desean poner un alias a su cuenta.
Cabe señalar que cuando se envía un correo a un usuario que tiene configurado el vacation o auto
response como también se lo conoce, la persona que envía el correo solo va a recibir una sola
notificación de que el usuario en cuestión esta de vacaciones, no recibira mas, en caso de querer sacar
esta opción se debe tener en cuenta de que se pueden causar bucles o loops en el servidor de correo si
alguien que tiene configurado el vacation envía a otro usuario que también lo tiene.
También encontraran el código del script vacation.pl para que vean como funciona cuando un usuario
tiene activado esta opción y que es lo pasa.
vacation.pl
#!/usr/bin/perl w
#
# Virtual Vacation 3.1
# by Mischa Peters <mischa at high5 dot net>
# Copyright (c) 2002 2005 High5!
# License Info: http://www.postfixadmin.com/?file=LICENSE.TXT
#
# Additions:
# 2004/07/13 David Osborn <ossdev at daocon.com>
# strict, processes domain level aliases, more
# subroutines, send reply from original to address
#
# 2004/11/09 David Osborn <ossdev at daocon.com>
# Added syslog support
# Slightly better logging which includes messageid
# Avoid infinite loops with domain aliases
#
use DBI;
use strict;
my $db_type = 'mysql';
my $db_host = 'localhost';
my $db_user = 'postfixadmin';
my $db_pass = 'postfixadmin';
my $db_name = 'postfix';
my $sendmail = "/usr/sbin/sendmail";
my $logfile = ""; # specify a file name here for example: vacation.log
my $debugfile = ""; # sepcify a file name here for example: vacation.debug
my $syslog = 0; # 1 if log entries should be sent to syslog
my $dbh = DBI>connect("DBI:$db_type:$db_name:$db_host", "$db_user", "$db_pass",
{ RaiseError => 1 });
# used to detect infinite address lookup loops
my $loopcount=0;
sub do_query {
my ($query) = @_;
my $sth = $dbh>prepare($query) or die "Can't prepare $query: $dbh>errstr\n";
$sth>execute or die "Can't execute the query: $sth>errstr";
return $sth;
}
sub do_debug {
my ($in1, $in2, $in3, $in4, $in5, $in6) = @_;
if ( $debugfile ) {
my $date;
open (DEBUG, ">> $debugfile") or die ("Unable to open debug file");
chop ($date = `date "+%Y/%m/%d %H:%M:%S"`);
print DEBUG "====== $date ======\n";
printf DEBUG "%s | %s | %s | %s | %s | %s\n", $in1, $in2, $in3, $in4, $in5,
$in6;
close (DEBUG);
}
}
sub do_cache {
my ($to, $from) = @_;
my $query = qq{SELECT cache FROM vacation WHERE email='$to' AND
FIND_IN_SET('$from',cache)};
my $sth = do_query ($query);
my $rv = $sth>rows;
if ($rv == 0) {
$query = qq{UPDATE vacation SET cache=CONCAT(cache,',','$from') WHERE
email='$to'};
$sth = do_query ($query);
}
return $rv;
}
sub do_log {
my ($messageid, $to, $from, $subject) = @_;
my $date;
if ( $syslog ) {
open (SYSLOG, "|/usr/bin/logger p mail.info t Vacation") or die ("Unable
to open logger");
printf SYSLOG "OrigTo: %s From: %s MessageID: %s Subject: %s", $to,
$from, $messageid, $subject;
close (SYSLOG);
}
if ( $logfile ) {
open (LOG, ">> $logfile") or die ("Unable to open log file");
chop ($date = `date "+%Y/%m/%d %H:%M:%S"`);
print LOG "$date: To: $to From: $from Subject: $subject MessageID:
$messageid \n";
close (LOG);
}
}
sub do_mail {
my ($from, $to, $subject, $body) = @_;
open (MAIL, "| $sendmail t f $from") or die ("Unable to open sendmail");
print MAIL "From: $from\n";
print MAIL "To: $to\n";
print MAIL "Subject: $subject\n";
print MAIL "XLoop: Postfix Admin Virtual Vacation\n\n";
print MAIL "$body";
close (MAIL);
}
sub find_real_address {
my ($email) = @_;
if (++$loopcount > 20) {
do_log ("find_real_address loop!", "currently: $email", "ERROR", "ERROR");
print ("possible infinite loop in find_real_address for <$email>. Check for
alias loop\n");
exit 1;
}
my $realemail;
my $query = qq{SELECT email FROM vacation WHERE email='$email' and active=1};
my $sth = do_query ($query);
my $rv = $sth>rows;
# Recipient has vacation
if ($rv == 1) {
$realemail = $email;
} else {
$query = qq{SELECT goto FROM alias WHERE address='$email'};
$sth = do_query ($query);
$rv = $sth>rows;
# Recipient is an alias, check if mailbox has vacation
if ($rv == 1) {
my @row = $sth>fetchrow_array;
my $alias = $row[0];
$query = qq{SELECT email FROM vacation WHERE email='$alias' and
active=1};
$sth = do_query ($query);
$rv = $sth>rows;
# Alias has vacation
if ($rv == 1) {
$realemail = $alias;
}
# We still have to look for domain level aliases...
} else {
my ($user, $domain) = split(/@/, $email);
$query = qq{SELECT goto FROM alias WHERE address='\@$domain'};
$sth = do_query ($query);
$rv = $sth>rows;
# The receipient has a domain level alias
if ($rv == 1) {
my @row = $sth>fetchrow_array;
my $wildcard_dest = $row[0];
my ($wilduser, $wilddomain) = split(/@/, $wildcard_dest);
# Check domain alias
if ($wilduser) {
($rv, $realemail) = find_real_address ($wildcard_dest);
Comentarios de: vacation en postfix (0)
No hay comentarios